次の出力があります。
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