awk忽略双引号并比较两个文件
我有两个输入文件 文件1awk忽略双引号并比较两个文件,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
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"
工作原理:
此文件列表告诉awk先读取file1fs='[“|]+'file2
,然后将字段分隔符更改为双引号和竖条的任意组合,然后读取file2file1
FNR是awk从当前文件中读取的行数,NR是读取的总行数。因此,FNR==NR{a[$1]=1;next}
仅在读取第一个文件时为真。大括号中的命令仅对第一个文件执行 这将创建一个关联数组FNR==NR
,其键是a
的第一个字段,其值为1。file1
命令告诉awk跳过其余命令,在next
行重新开始next
只有当字段3中的数字没有出现在文件1中时,才是真的。如果为true,则执行默认操作,即打印该行。(使用我们选择的字段分隔符,您感兴趣的数字位于字段3中。)a[$3]==0
除了字段分隔符只是一个竖条之外,这与上面的类似。在本例中,您感兴趣的号码位于字段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"