逐行比较两个表
我需要逐行比较两个表上的一秒钟列。 表: 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)
尝试:
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
命令组合了提供给它的文件中的行,所以我在第一行输出中获得第一个文件的第一行和第二个文件的第一行,依此类推:
$ paste f1 f2 1a 2 1a 2 14 4g 1 4
这使您可以直接比较awk
的字段,然后可以打印所需的字符串。
awk
的next
命令跳过下一行而不处理其他命令,因此我不需要为第二个块写入$2 != $4
条件。
用awk
:
awk 'NR==FNR {a[NR]=$2; next}; a[FNR]==$2 {print "true"; next} \ {print "false"}' f1.csv f2.csv
-
{a[NR]=$2; next}
{a[NR]=$2; next}
将仅针对第一个文件f1.csv
,将使用键作为行号创建数组a
,并将值作为记录的第二个字段的对应值 -
a[FNR]==$2 {print "true"; next} {print "false"}
a[FNR]==$2 {print "true"; next} {print "false"}
检查数组a
中来自f2.txt
相应行号的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