当行匹配条件时删除列

Remove columns when line matches a condition

我试图从文本文件中删除与字符串匹配的行中的某些列,然后保持其余行不变。

假设我有一个文件(实际有几千行)

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 语句吗?尝试使用 next,但我认为我没有那个权利。

使用 GNU sed:

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

这会从包含 TGCA 的行中删除第一次出现的一个或多个 space,后跟任意数量的非 space——这是第二列,并且它前面的 space(s)。

对于BSD sed,这个要修改,因为它不理解\s或者\S(或者\+——有点蛋疼)。那样的话,

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

也一样。

我会说:

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

即:当该行包含TGCA时,将第2列替换为第3列并减少字段数。即,删除第 2 列。