awk 排除标题行

awk 排除标题行

我有以下输出:

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

相关内容