按行合并多个文件

按行合并多个文件

是否可以使用简单的 bash 脚本(sed?awk?)按照 File3 给出的指令将 File1 和 File2 的行复制到新的 File4 中。

 File1: /*two or more columns, tab delimited*/
    AC    456324
    DC    689712
    GH    123677
    KL    236587

File2: /*two or more columns, tab delimited*/
    DC    AABBC TTYJU
    AC    DDDEE YYUKI
    KL    GGHHG QQSSD

 File3: /*one column*/
    AC
    DC

File4 /*tab delimited*/
    AC    456324    DDDEE   YYUKI
    DC    689712    AABBC   TTYJU

我实际上是使用 Python 字典执行此操作,我想知道您是否知道一个简单的解决方法。

注意:这个问题以其最简单的形式已经有答案:按行合并文件

答案1

这是您链接到的更简单情况的扩展,使用数组awk

$ awk 'BEGIN{OFS="\t"} NR==FNR {a[$1]=$1;next;} \
    $1 in a {k=$1;$1="";a[k]=a[k]$0} END{for (i in a) print a[i]}' File3 File1 File2
AC      456324  DDDEE   YYUKI
DC      689712  AABBC   TTYJU

与 不同的是join,它不需要对关键字段上的文件进行预排序。

答案2

您可以使用命令公平地完成它join

$ join -j 1 <(sort file3) <(sort file1) > tmp ; \
    join -j 1 <(sort tmp) <(sort file2) | sed 's/ /\t/g' > file4
  • 我首先join使用文件3文件1自从文件3有钥匙。
  • 现在,我将上述命令的输出写入tmp现在再次加入tmp文件2
  • 现在,根据上述命令,输出将以空格分隔的格式显示。
  • 由于您的要求是制表符分隔格式,因此我将其提供给sed命令,该命令用制表符替换所有空格。
  • 最后我写给文件4根据您的要求。

答案3

如果“简单”意味着您不必编写大量代码,那么有很多工具,例如csvkit或者csv修复那里可以帮助您解决这个问题 - 特别是看看它们都提供的“join”子命令。

但如果你的意思是它不能有任何额外的要求,我认为没有“简单”的方法。至少它绝对不会是一句空话。

此外,无论如何,这不是我试图仅使用 bash 加上标准 Unix 实用程序来解决的问题。在我看来,对于此类事情,使用 Python 做得很好——尤其是当问题变得更加复杂时。

相关内容