2017-09-24 77 views
1

我有一个看起来像这样一个文件:的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 
+0

你有什么试过?你可以用'awk'或者''join'来完成。 – codeforester

+0

我正在考虑做类似: diff file1.txt file2.txt | grep \^\ <| sed's/< //' > part1.txt diff file1.txt file2.txt | grep \^\> | sed's /> //'> part2.txt 并以某种方式匹配基于位置的2个文件以获得一个像上面那样的文件。它看起来很笨拙而乏味。我需要同时为500多个文件执行此操作,因此一个命令会很好。 – m93

回答

1

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} 

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

+0

谢谢!你能否准确解释这段代码的每个部分是什么?我对bash很陌生,所以我不确定你的命令的每个部分都在做什么 – m93

+0

@ m93更新了我的答案。让我知道是否还有其他问题。 –

+0

非常感谢,这真的很有帮助! – m93