当行匹配条件时删除列
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 列。
我试图从文本文件中删除与字符串匹配的行中的某些列,然后保持其余行不变。
假设我有一个文件(实际有几千行)
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 列。