2012-12-05 132 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