我正在尝试从与文本字符串匹配的行中的文本文件中删除某些列,但是保持其余行不变。
说我有一个文件(实际上有数千行)
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语句?尝试使用下一个,但我不认为我有这个权利。
答案 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
也一样。