我是awk的新手,我试图达到我的一半要求。
输入:
NAME|AGE|GENDER|QUALIFICATION
ABC|21|M|UG
XYZ|23|F|PG
PQR|20|M|UG
期望输出:
1> NAME : ABC
1> AGE : 21
1> GENDER : M
1>QUALIFICATION : UG
--------------------------------
2> NAME : XYZ
2> AGE : 23
2> NDER : F
2>QUALIFICATION : PG
--------------------------------
3> NAME : PQR
3> AGE : 20
3> GENDER : M
3>QUALIFICATION : UG
--------------------------------
请注意,每行中的冒号(:)应根据最长列名的长度进行定位。
我使用命令
获得了以下输出awk -F "|" '{if(NR==1){ split($0, a) }else{ for(i=1;i<=NF;i++) print a[i]" : "$i}}' test.csv
半输出:
NAME : ABC
AGE : 21
GENDER : M
QUALIFICATION : UG
NAME : XYZ
AGE : 23
GENDER : F
QUALIFICATION : PG
NAME : PQR
AGE : 20
GENDER : M
QUALIFICATION : UG
答案 0 :(得分:1)
要格式化输出,请使用printf
:
$ awk -F "|" '{if(NR==1){ split($0, a) } else{ for(i=1;i<=NF;i++) printf "%i>%13s : %s\n",NR-1,a[i],$i; print "--------------------------------"}}' test.csv
1> NAME : ABC
1> AGE : 21
1> GENDER : M
1>QUALIFICATION : UG
--------------------------------
2> NAME : XYZ
2> AGE : 23
2> GENDER : F
2>QUALIFICATION : PG
--------------------------------
3> NAME : PQR
3> AGE : 20
3> GENDER : M
3>QUALIFICATION : UG
--------------------------------
工作原理:
for(i=1;i<=NF;i++) printf "%i>%13s : %s\n",NR-1,a[i],$i
根据格式%i>%13s : %s\n
打印每一行,其中%i
格式化整数,%13s
格式化13个空格用于右对齐字符串,%s
格式化自由格式字符串。
print "--------------------------------"
要获得分隔符,我们会在每行输入后打印它。
等效但更传统的awk方法是使用next
而不是if-else结构:
awk -F "|" 'NR==1{split($0, a);next} {for(i=1;i<=NF;i++) printf "%i>%13s : %s\n",NR-1,a[i],$i; print "--------------------------------"}' test.csv
这会产生相同的输出。
awk -F "|" 'NR==1{split($0, a);for(s in a)len=(length(a[s])>len?length(a[s]):len); print len;next} {for(i=1;i<=NF;i++) printf "%i>%"len"s : %s\n",NR-1,a[i],$i; print "--------------------------------"}' test.csv
的变化:
for(s in a)len=(length(a[s])>len?length(a[s]):len)
这可以找到最长标题的长度。
printf "%i>%"len"s : %s\n",NR-1,a[i],$i
这会调整格式以适应最长的标题。
答案 1 :(得分:1)
awk
救援!
awk -F'|' 'NR==1{for(i=1;i<=NF;i++)
{h[i]=$i; len=length($i);
if(max<len) max=len}; next}
{for(i=1;i<=NF;i++)
printf "%d> %"max"s : %s\n", NR-1,h[i],$i;
print "-----------------------"}' file
1> NAME : ABC
1> AGE : 21
1> GENDER : M
1> QUALIFICATION : UG
-----------------------
2> NAME : XYZ
2> AGE : 23
2> GENDER : F
2> QUALIFICATION : PG
-----------------------
3> NAME : PQR
3> AGE : 20
3> GENDER : M
3> QUALIFICATION : UG
-----------------------
答案 2 :(得分:0)
另一个 awk 变体:
awk -F"|" 'NR==1{ split($0,a,FS); for(i=1;i<=NF;i++) b[i]=length($i); asort(b) }
NR>1{ c++; for(i=1;i<=NF;i++) printf("%d>%"'b[4]'"s : %s\n",c,a[i],$i);
print "-----------------------"}' file
输出:
1> NAME : ABC
1> AGE : 21
1> GENDER : M
1>QUALIFICATION : UG
-----------------------
2> NAME : XYZ
2> AGE : 23
2> GENDER : F
2>QUALIFICATION : PG
-----------------------
3> NAME : PQR
3> AGE : 20
3> GENDER : M
3>QUALIFICATION : UG
-----------------------