我想比较 File1 的第 3 列和 File2 的第 2 列。如果 File1 第 3 列的任何值未出现在 File2 第 2 列中,则打印 File1 的整行。
文件1:
5/3/2021 Mobile $2,627.59
5/3/2021 Phone $2,056.11
5/3/2021 Loan $5,146.11
文件2:
5/11/2021 $2,627.59
5/12/2021 $2,056.11
5/15/2021 $7,516.11
5/13/2021 $406.11
5/12/2021 $2,056.11
期望的输出:
5/3/2021 Loan $5,146.11
答案1
awk '
NR==FNR{ values[$2]; next }
!($3 in values)
' File2 File1
这File2
首先读取数组中的第二个字段并将其保存values
为索引。该测试NR==FNR
仅适用于第一个非空输入文件。该脚本继续记录next
以跳过下一行代码。
然后File1
读取并检查第三个字段是否不作为数组中的索引出现values
。如果为 true,则打印当前记录(默认操作)。
答案2
使用带有进程替换的 shell(如果您的 shell 不带 ,则首先对文件进行单独排序<(...)
):
join -v 1 -1 3 -2 2 -o 1.1,1.2,1.3 \
<( sort -b -k 3,3 File1 ) \
<( sort -b -k 2,2 File2 )
这使用第一个数据集的第三列 ( -1 3
) 和另一个数据集的第二列 ( -2 2
) 作为连接字段,在两个排序的数据集之间执行关系 JOIN 操作。根据选项的指定,输出join
将是第一个文件的第一、第二和第三列-o
。仅输出第一个文件中无法连接到第二个文件中任何行的行 ( -v 1
)。
join
必须使用sort -b
将用作连接字段的列对输入进行排序,这就是两个进程替换的作用。
使用给定数据的输出将是
5/3/2021 Loan $5,146.11
如果您的文件使用制表符作为字段分隔符,您可能需要使用
join -t $'\t' -v 1 -1 3 -2 2 -o 1.1,1.2,1.3 \
<( sort -t $'\t' -b -k 3,3 File1 ) \
<( sort -t $'\t' -b -k 2,2 File2 )