2015-04-01 105 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 

也是这样。

相关问题