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

时间:2017-09-24 23:28:49

标签: bash sed diff matching multiple-files

我有一个看起来像这样的文件:

ReactDOM.render((
   <Router history = {browserHistory}>
      <Route path = "/" component = {App}>
         <IndexRoute component = {Home} />
         <Route path = "home" component = {Home} />
         <Route path = "about" component = {About} />
         <Route path = "contact" component = {Contact} />
      </Route>
   </Router>

), document.getElementById('app'))

更多说明:

  • column1中的某些值在2个文件中相同,但不是全部
  • 第2列中的值在2个文件之间都是相同的

我想识别列1中的值在2个文件之间不同的行。即在我的例子中,这些行1和4。我可以使用diff file1.txt和file2.txt来做到这一点。

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

 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 个答案:

答案 0 :(得分: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} { ... }

这个&#34;技巧&#34;对第一个文件执行第一个操作,对第二个文件执行第二个操作。

a[$2]=$1

键值查找表。第二列是关键的第一列是值。我们在读取第一个文件时构建此查找表。

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

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