使用 awk 修改文本

Posted

技术标签:

【中文标题】使用 awk 修改文本【英文标题】:Modifying text using awk 【发布时间】:2012-11-23 12:02:08 【问题描述】:

我正在尝试文件。一共有三列,我想删除第一列的部分文字:

range=chr1      20802865        20802871        
range=chr1      23866528        23866534

chr1      20802865        20802871        
chr1      23866528        23866534

我该怎么做?

我试过awk ' substr("range=chr*", 7) 'awk 'sub(/[^[:space:]]*\\/, "")1' 但它会删除文件的所有内容。

【问题讨论】:

下面的答案描述了更好的方法,但要明确一点:你当前的awk 命令的问题是你从不打印任何东西。在awk 中,如果指定地址不带命令,则默认命令打印整行;但是由于您正在指定命令(通过使用 ... ),除非您明确告诉它(通过调用print),否则它实际上不会打印任何内容。 【参考方案1】:

设置字段分隔符为=并打印第二个字段:

# With awk                                                                     
$ awk -F= 'print $2' file
chr1      20802865        20802871        
chr1      23866528        23866534

# Or with cut
$ cut -d= -f2 file                  
chr1      20802865        20802871        
chr1      23866528        23866534

# How about grep
$ grep -Po '(?<==).*' file
chr1      20802865        20802871        
chr1      23866528        23866534

# Temp file needed
$ cut -d= -f2 file > tmp; mv tmp file

如果要将更改存储回fileawkcutgrep 都需要临时文件,更好的解决方案是使用sed

 sed -i 's/range=//' file

这将替换 range= 没有任何内容,-i 表示更改已就地完成,因此无需像 sed 那样处理临时文件。

【讨论】:

【参考方案2】:

如果你不需要使用awk,你可以使用sed,我觉得更简单一些。希望您熟悉正则表达式运算符,例如 ^.

$ cat awkens
range=chr1      20802865        20802871
range=chr1      23866528        23866534
$ sed 's/^range=//' awkens
chr1      20802865        20802871
chr1      23866528        23866534

【讨论】:

【参考方案3】:

看起来您在文件中使用制表符而不是空格作为分隔符,所以:

awk 'BEGINFS="[=\t]"; OFS="\t" print $2, $3, $4' input_file

awk 'BEGINFS="[=\t]"; OFS="\t" $1=""; gsub("\t\t", "\t"); print' input_file

【讨论】:

在 awk 中删除字段很尴尬。删除字段 1 的另一种方法:for (i=2; i&lt;=NF; i++) $(i-1)=$i; NF--

以上是关于使用 awk 修改文本的主要内容,如果未能解决你的问题,请参考以下文章

多行文本文本输入框 textarea 可点击任意地方编辑

linux awk命令怎么用?

19.1 awk基础第十九章 awk

Swift:由字符串分隔的组件

QT中怎样读取中文文本文件!

windows 7 的文本默认编码方式是ANSI,而我想修改为UTF-8 不知在哪修改