3

我正在尝试使用 awk 修改文本文件。共有三列,我想删除第一列中的部分文本:

range=chr1      20802865        20802871        
range=chr1      23866528        23866534

chr1      20802865        20802871        
chr1      23866528        23866534

我怎样才能做到这一点?

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

4

3 回答 3

6

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

# 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

如果要将更改存储回两者awkcut并且需要临时文件,更好的解决方案是使用:grepfilesed

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

range=没有任何替代品,并且-i意味着更改是就地完成的,因此无需像sed为您那样处理临时文件的东西。

于 2012-12-05T15:48:01.113 回答
1

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

awk 'BEGIN{FS="[=\t]"; OFS="\t"} {print $2, $3, $4}' input_file

或者

awk 'BEGIN{FS="[=\t]"; OFS="\t"} {$1=""; gsub("\t\t", "\t"); print}' input_file
于 2012-12-05T15:47:49.850 回答
1

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

$ cat awkens
range=chr1      20802865        20802871
range=chr1      23866528        23866534
$ sed 's/^range=//' awkens
chr1      20802865        20802871
chr1      23866528        23866534
于 2012-12-05T15:51:52.687 回答