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

関連情報