比较 Linux 中的列

比较 Linux 中的列

我想比较 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 )

相关内容