![逐行比较两个表](https://linux22.com/image/1141371/%E9%80%90%E8%A1%8C%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E8%A1%A8.png)
我需要逐行比较两个表中的一秒列。表格:
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