根据键值比较不同布局的两个文件并将输出提取到第三个文件

根据键值比较不同布局的两个文件并将输出提取到第三个文件

我想根据键值比较两个文件并打印文件1中不匹配的记录。使用的分隔符是Pipe|

  • 输出为:
    I|234567|BCDE|234TFY|abc|12345
    
  • 文件一:
    I|123456|ABCD|123abc|xyz|23456
    I|234567|BCDE|234TFY|abc|12345
    
    关键列:第 2 列和第 5 列
  • 文件2:
    xyz|P|1001|123456
    bcd|P|1001|123467
    
    关键列:第 1 列和第 4 列

有人可以建议什么是正确的方法吗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 中

相关内容