2012-12-05 93 views
3

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

range=chr1  20802865  20802871   
range=chr1  23866528  23866534 

chr1  20802865  20802871   
chr1  23866528  23866534 

我怎样才能做到这一点?

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

+1

下面的答案描述了更好的方法,但要明确:目前的'awk'命令的问题是你永远不会打印任何东西。在'awk'中,如果你指定一个没有命令的地址,默认命令是打印整行;但是由于你*是*指定了命令(通过使用'{...}'),除非你明确地告诉它(通过调用'print'),否则它不会实际打印任何东西。 – ruakh

回答

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 

Both awkcutgrep需要临时文件,如果你想保存更改回file,一个更好的解决办法是使用sed

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

这种替代range=什么也没有和-i意味着改变就地这样做不需要像sed那样处理临时文件。

+0

+1;清洁的解决方案! =) –

+0

谢谢!完美的作品 – user1879573

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 
+1

在awk中删除字段很尴尬。另一种删除字段1的方法是:对于(i = 2; i <= NF; i ++)$(i-1)= $ i; NF - ' –

1

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

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