bash:将diff函数的内容输出为两列

bash:将diff函数的内容输出为两列,bash,sed,diff,matching,Bash,Sed,Diff,Matching,我有一个这样的文件: file1.txt rs13339951:45007956:T:C 45007956 rs2838331 45026728 rs5647 12335 rs4687576 5353566 file2.txt rs13339951 45007956 rs2838331 45026728 rs5647 12335 rs4687576:ATCFHF 5353566 更多说明: 第1列中的某些值在两个文件之间相同,但并非全部相同 第2列中的值在两个文件之间完

我有一个这样的文件:

 file1.txt
 rs13339951:45007956:T:C 45007956
 rs2838331 45026728
 rs5647 12335
 rs4687576 5353566

 file2.txt
 rs13339951 45007956
 rs2838331 45026728
 rs5647 12335
 rs4687576:ATCFHF 5353566
更多说明:

  • 第1列中的某些值在两个文件之间相同,但并非全部相同
  • 第2列中的值在两个文件之间完全相同
我想确定列1中的值在这两个文件中不同的行。即,我的示例中的第1行和第4行。我可以用diff file1.txt和file2.txt来实现这一点

但是,我希望获得这样的结束文件(见下文)。实际上,我的目标是使用sed替换另一个文件中一个文件的名称,以便两个文件完全匹配

rs13339951:45007956:T:C rs13339951
rs4687576 rs4687576:ATCFHF

awk非常适合这样做

awk 'FNR==NR {a[$2]=$1; next}  a[$2]!=$1 {print a[$2] " " $1}' file1 file2
输出

rs13339951:45007956:T:C rs13339951
rs4687576 rs4687576:ATCFHF

我们正在将两个文件传递给awk。它将连续地传递给他们

FNR==NR {.... next} { ... }
使用此“技巧”,第一个操作将针对第一个文件执行,第二个操作将针对第二个文件执行

a[$2]=$1
键值查找表。第二列是键,第一列是值。我们在读取第一个文件时构建此查找表

a[$2]!=$1 {print a[$2] " " $1}

迭代第二个文件时,将当前第一列与查找表中的值进行比较。如果它们不匹配,请打印所需的输出。

您尝试了什么?您可以使用
awk
或者可能的话,
join
。我正在考虑这样做:diff file1.txt file2.txt | grep\^ sed's/part1.txt diff file1.txt file2.txt | grep\^ sed/'>part2.txt,并根据位置以某种方式匹配这两个文件,以获得一个类似于上面的文件。不过,这看起来相当笨拙和乏味。我需要这样做超过500个文件在同一时间,所以一个单一的命令将是好的。谢谢!您能否准确地解释一下这段代码的每一部分的作用?我对bash很陌生,所以我不确定您的命令的每一部分都是什么doing@m93更新了我的答案。如果还有其他问题,请告诉我。非常感谢,这真的很有帮助!