awk是否在每行打印标题信息?

awk是否在每行打印标题信息?,awk,Awk,它可能会使用头来转换此文件 name,lastname,tall,age peter,rick,1.8,24 dany,beck,1.7,25 paty,lisp,1.4,45 姓名、姓氏、身高、年龄 彼得,里克,1.8,24 丹尼,贝克,1.7,25 帕蒂,lisp,1.4,45 对此 name:name,lastname:lastname,tall:tall,age:age name:peter,lastname:rick,tall:1.8,age:24 name:dany,lastname

它可能会使用头来转换此文件

name,lastname,tall,age peter,rick,1.8,24 dany,beck,1.7,25 paty,lisp,1.4,45 姓名、姓氏、身高、年龄 彼得,里克,1.8,24 丹尼,贝克,1.7,25 帕蒂,lisp,1.4,45 对此

name:name,lastname:lastname,tall:tall,age:age name:peter,lastname:rick,tall:1.8,age:24 name:dany,lastname:beck,tall:1.7,age:25 name:paty,lastname:lisp,tall:1.4,age:45 姓名:姓名,姓氏:姓氏,身高:身高,年龄:年龄 姓名:彼得,姓氏:里克,身高:1.8,年龄:24 姓名:丹妮,姓氏:贝克,身高:1.7,年龄:25 姓名:帕蒂,姓氏:lisp,身高:1.4,年龄:45 请帮帮我这里有一些提示

  • FS
    设置为
    将自动进行字符串拆分。由于您的每个字符串都被拆分为逗号位置的字段,因此您需要将
    OFS
    设置为
    ,以便在输出中的所有字段之间打印逗号

  • 当您有第一个字符串(pattern
    NR==1
    )时,您将整个字段集读取到一个数组中,该数组的索引从
    1
    NF
    ,然后您就知道了列标题。甚至可以使用已经附加了冒号的列标题来存储列标题,而不是在每个后续记录的每个迭代步骤中附加冒号

  • 也许从第二行开始输出记录是有意义的?您真的需要输出文件顶部的那些奇怪的
    name:name

  • 无论如何,对于从第二条记录开始的每条记录(模式
    NR>1
    ),或者即使没有限制(默认操作,没有模式),您只需a)迭代整个字段集,在每个字段前面加上相应的列标题,以及b)打印整个
    $0

  • 如果确实希望转换并打印第一行,则将默认操作放在第2项中的操作之后

    希望有帮助。

    您可以:

    awk -F, 'FNR==1{for (i=1;i<=NF;i++) head[i]=$i} 
                   {for (i=1;i<=NF;i++) 
                        {printf "%s:%s", head[i], $i; if (i<NF) printf ","}
                         print ""}' file
    

    在接受答案之前,你真的应该给它一点时间,这样你就有了一些选择

    $ awk '
        BEGIN{FS=OFS=","}
        NR==1{split($0,h); next}
        {for (i=1;i<=NF;i++) printf "%s:%s%s", h[i], $i, (i<NF?OFS:ORS)}
    ' file
    name:peter,lastname:rick,tall:1.8,age:24
    name:dany,lastname:beck,tall:1.7,age:25
    name:paty,lastname:lisp,tall:1.4,age:45
    
    $awk'
    开始{FS=OFS=“,”}
    NR==1{split($0,h);next}
    {对于awk中的(i=1;i):

    $ awk 'BEGIN{FS=OFS=","}NR==1{split($0,h,",");next}{for(i in h)$i=h[i] ":" $i}1' file
    name:peter,lastname:rick,tall:1.8,age:24
    name:dany,lastname:beck,tall:1.7,age:25
    name:paty,lastname:lisp,tall:1.4,age:45
    
    使用
    for(i in header)
    而不是循环当前记录。缺点是,如果数据记录的字段比header记录的字段多,它们就会丢失。解释如下:

    BEGIN { FS=OFS="," }                      # set delimiters
    NR==1 { split($0,h,","); next }           # split header to h hash
          { for(i in h) $i = h[i] ":" $i } 1  # loop header, rebuild $0 and print
    
    BEGIN { FS=OFS="," }                      # set delimiters
    NR==1 { split($0,h,","); next }           # split header to h hash
          { for(i in h) $i = h[i] ":" $i } 1  # loop header, rebuild $0 and print