代码之家  ›  专栏  ›  技术社区  ›  user3224522

以文件名作为第一列连接多个txt文件

  •  0
  • user3224522  · 技术社区  · 3 年前

    我想连接多个。txt文件在单个文件中,并将文件名作为每个文件前的第一列(以便了解数据来自哪个文件)。下面我使用的代码可以做到这一点,但只适用于第一行。

    for i in *.txt; do echo -n "$i," && cat "$i"; done > tmpfile; mv tmpfile all-files.txt;
    

    例如,输出如下:

    filename1.txt,COVERAGE SUMMARY,,Aligned bases in genome,80754336928,100.00
    filename1.txt,COVERAGE SUMMARY,,Average alignment coverage over genome,26.55
    filename2.txt,COVERAGE SUMMARY,,Aligned bases in genome,88896465740,100.00
    filename2.txt,COVERAGE SUMMARY,,Average alignment coverage over genome,33.40
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   Dudi Boy    3 年前

    建议 gawk 命令:

    打印文件名,后跟 , 在每个文件的第一行中。

    gawk 'BEGINFILE{printf("%s,",FILENAME)}1' *.txt
    

    打印文件名,后跟 , 在每个文件的每一行中。

    awk '{print FILENAME "," $0}' *.txt
    
        2
  •  2
  •   leu    3 年前

    我建议使用awk:

    for f in *.txt; do awk "{print \"$f, \" \$0}" "$f"; done
    
        3
  •  2
  •   RARE Kpop Manifesto    3 年前

    3种不同的变体,以及 sub() 是不是快了一点:

    代码

    {m,g} 'sub("^",FILENAME",")' FS='^$' *.txt
    

    基准测试

     ( time ( mawk2  '$NF=FILENAME","$NF' FS='^$' "${m3t}" )  | pvE9 >/dev/null)
    
     out9: 2.34GiB 0:00:02 [ 896MiB/s] [ 896MiB/s] [ <=> ]
    
     2.33s user 0.34s system 99% cpu 2.685 total
    

    ———————

     ( time ( mawk2  '$!_=FILENAME","$!_' FS='^$' "${m3t}" )  | pvE9 >/dev/null) | lgp3 
    
     out9: 2.34GiB 0:00:02 [ 876MiB/s] [ 876MiB/s] [<=> ]
    
     2.38s user 0.34s system 99% cpu 2.744 total
    

    ———————

    ( time ( mawk2  'sub("^",FILENAME",")' FS='^$' "${m3t}" )  | pvE9 >/dev/null) | lgp3 
     
     out9: 2.34GiB 0:00:02 [ 987MiB/s] [ 987MiB/s] [ <=> ]
    
     2.10s user 0.32s system 99% cpu 2.441 total