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

awk to ignore double quote and compare two files

我有两个输入文件

文件 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 的差异。我遇到了双引号 (") 的问题。

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

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

工作原理:

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

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

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

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

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

  • a[]==0

    仅当字段 3 中的数字未出现在 file1 中时才为真。如果为真,则执行默认操作,即打印该行。 (使用我们选择的字段分隔符,您感兴趣的数字在字段 3 中。)

备选

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

除了字段分隔符只是一个竖线外,这与上面的类似。在这种情况下,您感兴趣的数字在字段 2 中。我们使用 substr 从字段 2 的任一端删除一个字符,这具有删除双引号的效果。