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: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 请帮帮我这里有一些提示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
FS
设置为,
将自动进行字符串拆分。由于您的每个字符串都被拆分为逗号位置的字段,因此您需要将OFS
设置为,
,以便在输出中的所有字段之间打印逗号NR==1
)时,您将整个字段集读取到一个数组中,该数组的索引从1
到NF
,然后您就知道了列标题。甚至可以使用已经附加了冒号的列标题来存储列标题,而不是在每个后续记录的每个迭代步骤中附加冒号name:name
NR>1
),或者即使没有限制(默认操作,没有模式),您只需a)迭代整个字段集,在每个字段前面加上相应的列标题,以及b)打印整个$0
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