awk打印每行的标题信息?

时间:2017-03-13 20:52:48

标签: awk

可以使用标题

转换此文件
name,lastname,tall,age
peter,rick,1.8,24
dany,beck,1.7,25
paty,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

请帮帮我

4 个答案:

答案 0 :(得分:4)

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

$ 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

您似乎正在进行大量的文本转换,请阅读Arnold Robbins撰写的有效Awk编程第4版,以了解如何使用awk。

答案 1 :(得分: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

如果您不想要自己的标题,请添加next

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

答案 2 :(得分:1)

以下是一些提示。

  1. OFS设置为,会自动执行字符串拆分。由于您的每个字符串都被分成逗号位置的字段,因此您也希望将NR == 1设置为1,以便在输出中的所有字段之间打印逗号。

  2. 当你有第一个字符串(模式NF)时,你将整个字段集读入一个索引从name:nameNR > 1的数组,然后你就知道了列标题。使用已经附加的冒号存储列标题甚至是有意义的,以便在每个迭代步骤中不为每个后续记录附加冒号。

  3. 从第二行开始输出记录也许有意义吗?你真的需要输出文件顶部那些奇怪的$0吗?

  4. 无论如何,对于从第二个开始的每个记录(模式MKMapSnapshot),或者甚至没有限制(默认操作,没有模式),您只需要a)遍历整个字段在每个字段前面添加相应的列标题,并b)打印整个image

  5. 如果您真的想要转换和打印第一行,请在第2项的操作之后放置默认操作。

    希望它有所帮助。

答案 3 :(得分:1)

在awk中:

$ 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)而不是循环当前记录。缺点是,如果数据记录的字段多于标题记录,则它们会丢失。说明:

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