Shell 需要使用awk命令进行以下输出

Shell 需要使用awk命令进行以下输出,shell,awk,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>

我是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
--------------------------------
NAME : ABC
AGE : 21
GENDER : M
QUALIFICATION : UG
NAME : XYZ
AGE : 23
GENDER  : F
QUALIFICATION : PG
NAME : PQR
AGE : 20
GENDER : M
QUALIFICATION : UG
所需输出:

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
--------------------------------
NAME : ABC
AGE : 21
GENDER : M
QUALIFICATION : UG
NAME : XYZ
AGE : 23
GENDER  : F
QUALIFICATION : PG
NAME : PQR
AGE : 20
GENDER : M
QUALIFICATION : UG
请注意,每行中的冒号(:)应根据最长列名的长度进行定位

我使用命令得到了下面的输出

awk -F "|" '{if(NR==1){ split($0, a) }else{ for(i=1;i<=NF;i++) print a[i]" : "$i}}' test.csv

要格式化输出,请使用
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
--------------------------------
这将产生相同的输出

可变格式长度
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
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                                                                                                                     
-----------------------       
awk-F'|''NR==1{(i=1;i另一个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>
开始每一行?是的,行号应该在那里。13个空格不应该固定。正如我提到的,应该根据最长列名的长度来决定。@Chandu OK。答案针对可变标题长度进行了更新。感谢您的回答并提供了详细的解释:)完美的一个!工作:)仅供参考,您可以编写
printf“%d>%*s:%s\n”、NR-1、max、h[i]、$i
,而无需通过与
printf“%d>%”max“s:%s\n”、NR-1、h[i]、$i串联来创建格式字符串。这样可以更高效、更易于阅读,然后您可以指定
fmt=“%d>%*s:%s\n”
在NR==1或BEGIN部分,在代码的其余部分使用
printfmt、NR-1、h[i]、$i