【问题标题】:awk concatenate lines of files and files into single fileawk 将文件和文件的行连接成单个文件
【发布时间】:2016-01-03 12:17:49
【问题描述】:

我想将一个文件的几行连接成一行,然后再次将每个文件分隔为文件中的一条新记录。

file1.txt

aaa bbb ccc
ddd eee fff

file2.txt

hhh iii jjj
kkk lll mmm

新文件.txt

file1.txt aaa bbb ccc ddd eee fff
file2.txt hhh iii jjj kkk lll mmm

这是我想出的,但无法将文件分隔为记录。

 gawk  -v ORS=" " "LF != FILENAME { print FILENAME; LF=FILENAME }; {$1=$1} 1; END { printf("\n");}"  *.txt >newfile.txt

【问题讨论】:

    标签: awk concatenation


    【解决方案1】:

    您可以将@Jose Ricardo Bustos M. 解决方案重写为

    for f in file{1,2}.txt; do printf "%s %s\n" $f "$(tr '\n' ' ' <$f)"; done
    

    或用于 awk 解决方案

    $ awk 'FNR==1{f=FILENAME;a[f]=f} 
                 {a[f]=a[f] FS $0} 
              END{for(i in a) print a[i]}' file{1,2}.txt
    

    如果您的 awk 支持 ENDFILE,则可以简化。

    【讨论】:

    • 谢谢,脚本有效。 GAWK 支持 BEGINFILE/ENDFILE。但是如何简化呢?
    • 你可以摆脱数组和循环;连接变量上的字段并在 ENDFILE 处打印和重置 var。像这样awk 'BEGINFILE{a=FILENAME} {a=a FS $0} ENDFILE{print a}' file{1,2}
    【解决方案2】:

    你可以尝试使用tr

    for f in `ls file*.txt | sort`; do 
        printf "%s %s\n" "$f" "$(cat $f | tr '\n' ' ')"; 
    done
    

    你得到

    file1.txt aaa bbb ccc ddd eee fff file2.txt hhh iii jjj kkk lll mmm

    Awk 解决方案

    awk '
    LF != FILENAME{
        LF=FILENAME; 
        if(NR>1) printf "%s\n", s
        printf "%s ", LF; 
        s="";
    }
    {s=s $0}
    END{printf "%s\n", s}' file*.txt
    

    【讨论】:

      【解决方案3】:

      你可以试试这个单线,

      for f in *.txt; do printf "%s " $f; sed 'N; s/\n/ /g' $f; done >  newfile
      

      【讨论】:

        猜你喜欢
        • 2018-04-08
        • 1970-01-01
        • 2016-07-12
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多