【问题标题】:bash: output contents of diff function into 2 columnsbash:将 diff 函数的内容输出到 2 列
【发布时间】:2018-03-05 20:49:43
【问题描述】:

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

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

 file2.txt
 rs13339951 45007956
 rs2838331 45026728
 rs5647 12335
 rs4687576:ATCFHF 5353566

更多说明:

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

我想确定 2 个文件中 column1 中的值不同的行。 IE。在我的示例中,这些行 1 和 4。我可以用 diff file1.txt 和 file2.txt 做到这一点。

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

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

【问题讨论】:

  • 你试过什么?您可以使用awkjoin 来执行此操作。
  • 我正在考虑做类似的事情:diff file1.txt file2.txt | grep \^\ part1.txt diff file1.txt file2.txt | grep \^\> | sed's/> //' > part2.txt 并根据位置以某种方式匹配 2 个文件以获得一个文件,如上面的文件。不过,这似乎很笨拙和乏味。我需要同时对 500 多个文件执行此操作,这样一个命令就可以了。

标签: bash sed diff matching


【解决方案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}

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

【讨论】:

  • 谢谢!您能否准确解释这段代码的每个部分的作用?我对 bash 很陌生,所以我不确定你的命令的每个部分到底在做什么
  • @m93 更新了我的答案。如果还有其他问题,请告诉我。
  • 非常感谢,这真的很有帮助!
猜你喜欢
  • 2014-03-28
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 2014-04-16
相关资源
最近更新 更多