Shell 需要使用awk命令进行以下输出
我是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>
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;iawk
)救命
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
。