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

awk忽略双引号并比较两个文件,awk,gawk,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" 现在,我如何比较和打印文件1中的$1和文件2中的$2的差异。由于双引号(“)的原因,我遇到了问题 那么,忽略双引号,如何比较差异呢 $ awk 'FNR==NR{a[$1]=1;next} a[$3]==0' file1 FS

我有两个输入文件

文件1

123
125
123
129
和文件2

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

"b"|"124"|"ind"
"d"|"122"|"aus"
现在,我如何比较和打印文件1中的$1和文件2中的$2的差异。由于双引号(“)的原因,我遇到了问题

那么,忽略双引号,如何比较差异呢

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

  • file1fs='[“|]+'file2

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

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

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

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

  • a[$3]==0

    只有当字段3中的数字没有出现在文件1中时,才是真的。如果为true,则执行默认操作,即打印该行。(使用我们选择的字段分隔符,您感兴趣的数字位于字段3中。)

可供替代的
除了字段分隔符只是一个竖条之外,这与上面的类似。在本例中,您感兴趣的号码位于字段2中。我们使用
substr
从字段2的任意一端删除一个字符,这具有删除双引号的效果。

请您解释一下它是如何工作的,我的意思是为什么您需要$3???@bongboy,因为他使用
FS='[“|]+“
第二个字段成为
awk
的第三个字段。Eks
$3
给出
124
122
etc@bongboy我只是对答案添加了一些解释。使用
[“|]+
作为字段分隔符,那么行
“b”|“124”|“ind”
有四个字段,第一个是空的,第二个是
b
,第三个是
124
,第四个是
ind
$ awk 'FNR==NR{a[$1]=1;next} a[substr($2,2,length($2)-2)]==0' file1 FS='|' file2
"b"|"124"|"ind"
"d"|"122"|"aus"