逐行比较两个表

逐行比较两个表

我需要逐行比较两个表中的一秒列。表格: 1.csv

1a  2
14  4g

2.csv

1a  2
1  4

脚本:

#!/bin/bash
text1=$(cat "1.csv" | awk '{print $2}')
text2=$(cat "2.csv" | awk '{print $2}')

if [[ "$text1" == "$text2" ]]
then
echo "true"
else
echo "false"
fi

但我只得到一个结果-错误。

为什么我只得到一个结果 - 错误?一定是真 (2=2) 假 (4g!=4)

答案1

尝试:

paste 1.csv 2.csv | awk '$2 == $4 {print "true"; next} {print "false"}'

例子:

$ paste 1.csv .csv | awk '$2 == $4 {print "true"; next} {print "false"}'
true
false

paste命令将提供给它的文件中的行组合在一起,因此我在输出的第一行中得到第一个文件的行`和第二个文件的第 1 行,依此类推:

$ paste f1 f2
1a  2   1a  2
14  4g  1  4

这使您可以直接比较中的字段awk,然后可以打印所需的字符串。

next中的命令跳到awk下一行而不处理进一步的命令,所以我不需要$2 != $4为第二个块写条件。

答案2

awk

awk 'NR==FNR {a[NR]=$2; next}; a[FNR]==$2 {print "true"; next} \
                                            {print "false"}' f1.csv f2.csv
  • {a[NR]=$2; next}仅针对第一个文件执行f1.csv,将创建一个数组,a其键为行号,值作为记录的第二个字段的对应值

  • a[FNR]==$2 {print "true"; next} {print "false"}a检查数组中对应行号的值是否f2.txt等于其第二个字段,如果是则true打印,否则false打印

例子:

% cat f1.csv 
1a  2
14  4g

% cat f2.csv                                                                                                                  
1a  2
1  4

% awk 'NR==FNR {a[NR]=$2; next}; a[FNR]==$2 {print "true"; next} {print "false"}' f1.csv f2.csv  
true
false

相关内容