AWK 中 tsv 文件的多重替换

AWK 中 tsv 文件的多重替换

我的文件中有以下几行file.sh

awk '$2 != "$ID1$"' myfile2.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID2$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID3$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID4$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID5$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID6$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID7$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID8$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID9$"' myfile3.tsv > output && mv output myfile4.tsv
...

这就像一个魅力,但我需要将其重构为如下所示,因为我有几行(+600):

awk '$2 != "$ID1$", $2 != "$ID2$", $2 != "$ID3$" ...' myfile3.tsv > output && mv output myfile3.tsv

我已经尝试了一切,但找不到具有正确语法的密钥。

预先非常感谢。

答案1

实现您想要的目标的一种方法如下。您填写的 lim 变量以获得所需数量的参数。

awk -F '\t' -v lim=9 '
  BEGIN {
    OFS = FS
    for (i=1; i<=lim; i++) a["$ID"  i "$"]
  }
  $2 in a {next}
1'  yourfile.tsv

答案2

在这种情况下,您期望逗号运算符做什么,根据手册它会做什么?

如果您已尝试过所有方法,您是否也尝试过使用 AND 运算符来创建 AND 条件?

awk '$2 != "$ID1$" && $2 != "$ID2$"' myfile3.tsv > output

如果你想要一些奇特的东西,你可以在 awk 中使用数组。

如果您的搜索词未出现在该行的其他部分,您可以使用grep -v

答案3

如果您无法生成 ID 而必须手动列出它们,那么它是:

awk -v ids='$ID1$ $ID2$' '
    BEGIN { split(ids,tmp); for (i in tmp) idarr[tmp[i]] }
    !($2 in idarr)
' file

或者如果它们分别存储在名为 的文件中的单独行中ids

awk '
    NR==FNR { idarr[$1]; next }
    !($2 in idarr)
' ids file

或者一些类似的方法,以哈希查找结束。

相关内容