满足条件时删除字符串

Remove a string when a condition is met

我有一个制表符分隔的文本,文本中有一个多次出现的字符串,当它与其他字符串一起出现时我需要将其删除。

A       B      C        D   E   F   G   H   I   J
string  string string   car29   ""  ""  ""  ""  ""  string # We don't do anything
string  string string   pool    car29   ""  ""  ""  ""  string # Remove car29
string  string string   fifo    pool    car29   ""  ""  ""  string # Remove car29
string  string string   car29   ""  ""  ""  ""  ""  string # We don't do anything

关键词是car29,我们只对出现这个词的行进行操作

预期输出

A       B      C        D   E   F   G   H   I   J
string  string string   car29   ""  ""  ""  ""  ""  string 
string  string string   pool    ""  ""  ""  ""  ""  string 
string  string string   fifo    pool    ""  ""  ""  ""  string 
string  string string   car29   ""  ""  ""  ""  ""  string 

Perl 来拯救!

perl -F'/\t/' -ape 's/(^|(?<=\t))car29($|(?=\t))/""/g if grep $_ ne "car29" && $_ ne q(""), @F[3..8]'
  • -F 设置列分隔符
  • -a 拆分为列(进入 @F 数组)
  • -p 逐行处理输入,打印结果
  • 仅当第 3 .. 8 列(只是猜测,您的说明含糊不清)不为空且与 car29
  • 不同时才会发生替换
  • 当它前面是行首或制表符,后面是行尾或制表符时,car29 替换为 ""。环顾四周断言用于有多个 car29 相邻的情况。 ^$ 可能不需要,因为示例中的前三列和最后一列从不包含 car29(又是不完整的规范)。

sed

sed '/\(.*"".*\)\{5\}/! s/car29/""/' <<\eof
A       B      C        D   E   F   G   H   I   J
string  string string   car29   ""  ""  ""  ""  ""  string # We don't do anything
string  string string   pool    car29   ""  ""  ""  ""  string # Remove car29
string  string string   fifo    pool    car29   ""  ""  ""  string # Remove car29
string  string string   car29   ""  ""  ""  ""  ""  string # We don't do anything
eof

A       B      C        D   E   F   G   H   I   J
string  string string   car29   ""  ""  ""  ""  ""  string # We don't do anything
string  string string   pool    ""   ""  ""  ""  ""  string # Remove car29
string  string string   fifo    pool    ""   ""  ""  ""  string # Remove car29
string  string string   car29   ""  ""  ""  ""  ""  string # We don't do anything