删除与Shell脚本中第二个文件中的前2个字段匹配的文件中的行

巴姆克夫

假设我有setA.txt

a|b|0.1
c|d|0.2
b|a|0.3

我也有setB.txt

c|d|200
a|b|100

现在,我要从setA.txt与前两个字段相同的行中删除setB.txt,因此输出应为:

b|a|0.3

我试过:

comm -23 <(sort setA.txt) <(sort setB.txt)

但是等式是为整行定义的,因此它将不起作用。我怎样才能做到这一点?

约翰1024
$ awk -F\| 'FNR==NR{seen[$1,$2]=1;next;} !seen[$1,$2]' setB.txt setA.txt
b|a|0.3

这将setB.txt读取一次,从中提取所需的信息,然后setA.txt在决定打印哪些行的同时进行读取

怎么运行的

  • -F\|

    这会将字段分隔符设置为竖线|

  • FNR==NR{seen[$1,$2]=1;next;}

    FNR是到目前为止从当前文件读取的行数,而NR是读取的总行数。因此,当时FNR==NR,我们正在读取第一个文件setB.txt如果是这样,则将由字段1和2组成的键将关联数组的值设置seen为true 1最后,跳过其余命令,然后重新开始next

  • !seen[$1,$2]

    如果获得此命令,我们正在处理第二个文件setA.txt由于!表示否定,因此条件为true(如果seen[$1,$2]为false),这表示字段1和2的组合不在中setB.txt如果是这样,则执行默认操作,即打印该行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

sed:如何删除文件中的第二个匹配项

从第二个文件中获取更改行

与第二个字段相关时在一个字段中查找完全匹配

如何根据从第二个文件获取的值范围来排除文件中的行

在两个csv文件中匹配一个字符串,但是第二个文件太大,无法读入列表

从git log输出中替换文件中的第二个字段

比较两个文件并从第二个文件中获取匹配的行

无法访问JavaScript中2维数组中的第二个字段

sed读取一个文件并删除第二个文件中的模式

在一个文件中获取与模式匹配的行,并将其放入与相同模式匹配的第二个文件中

在shell脚本中查找并将一个文件中包含的行字符串替换为第二个文件

awk查找两个文件中第二个字段之间的差异

如何根据第二个文件中的信息删除文件中的某些列?

将文件中的重复数据与第二个文件中的第二列进行匹配

在一个文件中替换文本并在第二个文件中匹配

将第二行的第二个字段附加到文件中的第一行

保留第一个文件中与第二个文件不匹配的行

列出与第二个文件中的关键字不匹配的全行

在第二个字段中删除CSV中包含特定模式的行

如果第一个文件的行与Linux中第二个文件中存在的字符串匹配,如何删除该行?

比较两个文件的第一列和第二列,如果匹配则打印第二个文件中的行

如果它们恰好匹配第二个文件中的字符串,如何从一个文件中删除字符串?

如何在文件的第二个字段中执行基名并在行中替换它

以第二个字符开头对Unix中的文件夹进行排序

根据第二个文件中的模式匹配映射第一个文件的字段

如何计算文件中第二个字段的平均值?

如果倒数第二个或倒数第二个字符是 CSV 第一列中的空格,则删除行

如果 CSV 2 和 CSV 1 中的字段具有字段匹配,则删除第二个 CSV 的行

Bash / Regex:当某些第一个字段以引号和逗号开头时替换 CSV 文件中的第二个字段