【问题标题】:Join multiple files in gawk在 gawk 中加入多个文件
【发布时间】:2014-06-04 03:01:55
【问题描述】:

我有大量文件(大约 500 个)。每个文件包含两列。每个文件的第一列都是相同的。我想使用 gawk 将所有文件合并到一个文件中。
例如,

File 1  
a 123  
b 221  
c 904 

File 2 
a 298  
b 230  
c 102  

等等。我想要一个如下的最终文件:

Final file
a 123 298  
b 221 230  
c 904 102  

我找到了可以连接两个文件的脚本,但我需要连接多个文件。

【问题讨论】:

    标签: awk gawk


    【解决方案1】:

    对于给定的示例文件:

    $ head f*
    ==> f1 <==
    a 123
    b 221
    c 904
    
    ==> f2 <==
    a 298
    b 230
    c 102
    
    ==> f3 <==
    a 500
    b 600
    c 700
    

    方法一:

    $ awk '{a[FNR]=((a[FNR])?a[FNR]FS$2:$0)}END{for(i=1;i<=FNR;i++) print a[i]}' f*
    a 123 298 500
    b 221 230 600
    c 904 102 700
    

    方法 2:(可能会更快,因为您没有在内存中加载 500 个文件)

    同时使用pasteawk。 (假设第一列相同并且存在于所有文件中)。执行paste f* 会给你以下结果:

    $ paste f*
    a 123   a 298   a 500
    b 221   b 230   b 600
    c 904   c 102   c 700
    

    将其传递给awk 以删除多余的列。

    $ paste f* | awk '{printf "%s ",$1;for(i=2;i<=NF;i+=2) printf "%s%s",$i,(i==NF?RS:FS)}'
    a 123 298 500
    b 221 230 600
    c 904 102 700
    

    您可以将输出重定向到另一个文件。

    【讨论】:

    • 非常适合我。
    • 太好了,很高兴我能帮上忙。
    • @userpmondal :不要犹豫,为您认为有用的答案投票;)
    • @userpmondal 别担心。你很快就会到达那里! :)
    • @userpmondal arf,我不知道对不起。
    【解决方案2】:

    我经常遇到这个问题。

    我强烈建议您检查 gawk 中的 getline 函数。

    getline var < filename
    

    是命令语法,可以用来解决你的问题。

    我建议使用另一种更容易解决此问题的语言。通常我会投入大约 5 行代码来解决这个标准问题。

    j=1;
    j=getline x < "filename";
    if(j==0) {
          break;
    }
    ... (Commands involving x such as split and print).
    

    【讨论】:

    • 你将如何使用getline?就目前而言,这不是一个非常完整的答案。请注意,其他答案均未使用getline,因此您将添加一个具有更完整答案的新方法。
    【解决方案3】:

    你可以试试这样的:

    $ ls
    f1.txt  f2.txt  f3.txt
    $ awk '($0 !~ /#/){a[$1]=a[$1]" "$2} END {for(i in a){print i""a[i]}}' *.txt
    a 123 298 299
    b 221 230 231
    c 904 102 103
    

    【讨论】:

    • 您也可以使用awk '{a[$1]=(a[$1])?a[$1] FS $2:$2}END{for(i in a){print i,a[i]}}' *.txt,但这不会保留文件的顺序。由于in 运算符 (for(i in a)),最终输出将是随机的。
    【解决方案4】:
    awk 'FNR==NR{arr[$1]=$2; next;}{printf "%s%s%s%s%s",$1,OFS,arr[$1],OFS,$2; print"";}' file1 file2
    

    基于this

    【讨论】:

    • 这仅适用于 2 个文件。 OP 希望将大约 500 个文件连接在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2021-11-13
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多