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 的任一端删除一个字符,这具有删除双引号的效果。
我有两个输入文件
文件 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 的任一端删除一个字符,这具有删除双引号的效果。