2015-04-01 103 views
0

我想從文本文件中刪除與字符串匹配的行的某些列,但是保留行的其餘部分不變。當行匹配條件時刪除列

說我有(實際上行的千元),文件

10 12 a 
USA John TGCAGG 
USA John TGCATG 
5 2 b 
CAN Tom TGCACG 
CAN Tom TGCAAC 
.... 

我想創建一個新的文件,該文件中刪除包含TGCA行2列,但保留全部其他線路不變。我想看看:

10 12 a 
USA TGCAGG 
USA TGCATG 
5 2 b 
CAN TGCACG 
CAN TGCAAC 

我可以修改哪些列上匹配使用正則表達式來啓動AWK或sed的線條打印,但我不能讓其他線路(未修正)打印,或到保持這些行的順序。

我需要在awk中使用if語句嗎?嘗試使用下一個,但我不認爲我有這個權利。

回答

3

我會說:

$ awk '/TGCA/ {$2=$3; NF--} 1' file 
10 12 a 
USA TGCAGG 
USA TGCATG 
5 2 b 
CAN TGCACG 
CAN TGCAAC 

也就是說:當行包含TGCA,更換3號第2列,減少字段的數目。也就是,刪除第二列。

+0

我不太關注NF如何在這裏使用或如何設置所需的數字字段...如果有4列,我想保持3和4?或者讓我說我想保留第1和第3和第4列(但不是2)?有沒有更通用的方法來做到這一點(或解釋代碼)而不減少字段? – 2015-04-01 18:46:24

+0

在awk中刪除列是非常棘手的。爲了防止獲得尾隨空格,我會去做這樣的事情:[如何使用shell(awk,sed,whatever)刪除文件中的前兩列](http://stackoverflow.com/a/14715189/1983854) – fedorqui 2015-04-01 18:51:24

+0

所以,如果你能負擔得起減少'NF'是好的。如果它必須更復雜,我仍然會進行某種列移動,並最終減少「NF」。 – fedorqui 2015-04-01 18:56:50

2

隨着GNU sed的:

sed '/TGCA/ s/\s\+\S*//' filename 

這從包含線去除TGCA一個或多個空格,隨後任意數量的非空間的第一次出現 - 這是第二列和所述空間(一個或多個)在它之前。

對於BSD sed,必須修改,因爲它不理解\s\S(或\+ - 這有點痛苦)。在這種情況下,

sed '/TGCA/ s/[[:space:]]\{1,\}[^[:space:]]*//' filename 

也是這樣。

相關問題