需要使用awk命令输出以下内容

时间:2017-05-27 19:03:50

标签: shell awk

我是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

3 个答案:

答案 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
-----------------------