当行符合条件时删除列

时间:2015-04-01 18:29:48

标签: regex bash awk sed pattern-matching

我正在尝试从与文本字符串匹配的行中的文本文件中删除某些列,但是保持其余行不变。

说我有一个文件(实际上有数千行)

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

我想创建一个新文件,删除包含TGCA的行中的第二列,但保留所有其他行。我想看看:

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

我可以修改哪些列在使用正则表达式匹配的行上打印以启动awk或sed,但我无法打印其他行(未修改)或保留这些行的顺序。

我是否需要在awk中使用if语句?尝试使用下一个,但我不认为我有这个权利。

2 个答案:

答案 0 :(得分:3)

我会说:

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

即:当该行包含TGCA时,将第二列替换为第三列并减少字段数。也就是说,删除第二列。

答案 1 :(得分:2)

使用GNU sed:

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

这将从包含TGCA的行中删除第一个出现的一个或多个空格,后跟任意数量的非空格 - 这是第二列和它之前的空格。

对于BSD sed,这必须进行修改,因为它不了解\s\S(或\+ - 这有点痛苦)。在那种情况下,

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

也一样。