我的文件中有以下几行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
或者一些类似的方法,以哈希查找结束。