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列中的值在两个文件之间完全相同
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更新了我的答案。如果还有其他问题,请告诉我。非常感谢,这真的很有帮助!