我想根据键值比较两个文件并打印文件1中不匹配的记录。使用的分隔符是Pipe|
- 输出为:
I|234567|BCDE|234TFY|abc|12345
- 文件一:
关键列:第 2 列和第 5 列I|123456|ABCD|123abc|xyz|23456 I|234567|BCDE|234TFY|abc|12345
- 文件2:
关键列:第 1 列和第 4 列xyz|P|1001|123456 bcd|P|1001|123467
有人可以建议什么是正确的方法吗awk
?
答案1
您可以使用以下awk
程序来执行此操作:
awk -F'|' 'FNR==NR{key1[FNR]=$1;key2[FNR]=$4;next}
{if ($2!=key2[FNR] || $5!=key1[FNR]) print}' file2.txt file1.txt
- 这将首先解析
file2.txt
并构建第 1 列和第 4 列的每行列表。我们可以看到,我们通过断言FNR
,每文件行计数器 ,等于NR
,全局行计数器 (但请注意如果它是空的,它就会被破坏file2.txt
!)。 - 然后,在解析 时
file1.txt
,对于每一行,第 2 列和第 5 列将与处理时填充的列表进行比较file2.txt
,如果不匹配,则打印该行。
答案2
你可以尝试这样的事情:
while read -r line;
do
myvar2=$(line | awk '{ print $2}')
if grep -Fxq "$myvar" file2
then
# code if found
else
# code if not found
fi
myvar5=$(line | awk '{ print $5}')
if grep -Fxq "$myvar5" file2
then
# code if found
else
# code if not found
fi
done < file1
代码未经过测试。这应该从 file1 中逐行读出,column2 分开,column5 分开, awk '{ print $2 $5}'
应该读取 2 和 5 并检查 myvar 是否存在于 file2 中