我有以下输出:
Course: StudentCount
('BCA_27', 2L)
('MCA_34', 15L)
('BBA_26', 3L)
('BBM_02', 14L)
('MBA_23', 13L)
我正在使用以下命令从中删除不需要的字符:
<output> |sed "s/['()]//g;s/,/:/g;s/\([0-9]\)L[ ]*$/\1/g;"|awk '{print $NF,$0}' | sort -nr | cut -f2- -d' '
现在输出是:
MCA_34 : 15
BBM_02 : 14
MBA_23 : 13
BBA_26 : 3
BCA_27 : 2
Course : StudentCount
我应该如何防止awk
排除标题行,以便输出为:
Course : StudentCount
MCA_34 : 15
BBM_02 : 14
MBA_23 : 13
BBA_26 : 3
BCA_27 : 2
答案1
当您使用 awk 时,您永远不需要 sed:
$ awk -F"[',: ]+" -v OFS=' : ' '{print (NR>1) "\t" (NR==1 ? $1 OFS $2 : $3 OFS $4+0)}' file |
sort -k1,1n -k4,4nr | cut -f2-
Course : StudentCount
MCA_34 : 15
BBM_02 : 14
MBA_23 : 13
BBA_26 : 3
BCA_27 : 2
答案2
您可以使用 tail 跳过特定数量的标题行,这里是一个示例:
command | awk '{print $1}' | tail +2
对命令结果的第一个字段执行 awk 后,这将跳过前 2 行。
答案3
正在研究建议普鲁莫给出了评论为了使其更加灵活,您可以将 AWK 命令更改为:
awk 'NR==1 {h=$0; next} {print $NF,$0; if ($NF>m) m=$NF} END {print (m+1),h}'
其想法是保证标头前面添加比任何其他行更高的数字,记录整个输入数据的最大值,并且仅在处理最后一行后打印标头。
或者,如果您的系统支持/dev/fd/n
文件描述符链接的类型,您可以复制整个管道的标准输出,并将awk
标题行打印到新的文件描述符,从而防止它执行后续命令:
sed "s/['()]//g;s/,/:/g;s/\([0-9]\)L[ ]*$/\1/g;" |
{ awk 'NR == 1 {print >("/dev/fd/3"); next} {print $NF,$0}' |
sort -nr |
cut -f2- -d' '; } 3>&1
答案4
通过 sed 脚本完成:
sed -e '1d' -e '2,$s/[^A-Z_0-9]/ /g' -r -e 's/\s+/;/g' -e 's/^;//g' -e 's/[A-Z];$//g' filename
输出
BCA_27;2
MCA_34;15
BBA_26;3
BBM_02;14
MBA_23;13