的bash:DIFF函数的输出内容到2列
问题描述:
我有一个看起来像这样一个文件:的bash:DIFF函数的输出内容到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个文件之间相同但不是所有的
- 的column2中值均为2档之间相同
我想,以确定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'来完成。 – codeforester
我正在考虑做类似: diff file1.txt file2.txt | grep \^\ part1.txt diff file1.txt file2.txt | grep \^\> | sed's /> //'> part2.txt 并以某种方式匹配基于位置的2个文件以获得一个像上面那样的文件。它看起来很笨拙而乏味。我需要同时为500多个文件执行此操作,因此一个命令会很好。 – m93