可以使用标题
转换此文件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
请帮帮我
答案 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)
以下是一些提示。
将OFS
设置为,
会自动执行字符串拆分。由于您的每个字符串都被分成逗号位置的字段,因此您也希望将NR == 1
设置为1
,以便在输出中的所有字段之间打印逗号。
当你有第一个字符串(模式NF
)时,你将整个字段集读入一个索引从name:name
到NR > 1
的数组,然后你就知道了列标题。使用已经附加的冒号存储列标题甚至是有意义的,以便在每个迭代步骤中不为每个后续记录附加冒号。
从第二行开始输出记录也许有意义吗?你真的需要输出文件顶部那些奇怪的$0
吗?
无论如何,对于从第二个开始的每个记录(模式MKMapSnapshot
),或者甚至没有限制(默认操作,没有模式),您只需要a)遍历整个字段在每个字段前面添加相应的列标题,并b)打印整个image
。
如果您真的想要转换和打印第一行,请在第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