awk忽略双引号并比较两个文件

时间:2015-05-04 06:10:40

标签: awk gawk

我有两个输入文件

文件1

123
125
123
129

和文件2

"a"|"123"|"anc"
"b"|"124"|"ind"
"c"|"123"|"su"
"d"|"122"|"aus"

输出:

"b"|"124"|"ind"
"d"|"122"|"aus"

现在我如何比较和打印file1的$ 1和file2的$ 2的差异。我的双引号有问题(")。

那么如何比较忽略双引号的差异?

1 个答案:

答案 0 :(得分:1)

 $ awk 'FNR==NR{a[$1]=1;next} a[$3]==0' file1 FS='["|]+' file2
"b"|"124"|"ind"
"d"|"122"|"aus"

工作原理:

  • file1 FS='["|]+' file2

    这个文件列表告诉awk首先读取file1,然后将字段分隔符更改为双引号和竖线的任意组合,然后读取file2。

  • FNR==NR{a[$1]=1;next}

    FNR是awk从当前文件读取的行数,NR是读取的总行数。因此,FNR==NR仅在读取第一个文件时才为真。大括号后面的命令仅对第一个文件执行。

    这将创建一个关联数组a,其键是file1的第一个字段,其值为1. next命令告诉awk跳过其余命令并重新开始在next行。

  • a[$3]==0

    只有在file1中没有出现字段3中的数字时才会出现这种情况。如果为true,则采用默认操作来打印该行。 (使用我们选择的字段分隔符,您感兴趣的数字位于字段3中。)

替代

$ awk 'FNR==NR{a[$1]=1;next} a[substr($2,2,length($2)-2)]==0' file1 FS='|' file2
"b"|"124"|"ind"
"d"|"122"|"aus"

这与上面的类似,只是字段分隔符只是一个垂直条。在这种情况下,您感兴趣的数字在字段2中。我们使用substr从字段2的任一端删除一个字符,这样可以删除双引号。