次のデータを含む入力ファイルがあります。
November 400
January 200
June 400
March 200
April 200
May 300
July 400
August 300
September 400
February 300
October 300
December 200
データファイルを1行ずつ処理し、それを出力ファイルに送信すると、次のような結果をもたらすループ構造を作成する必要があります。
Month Sales
----- -----
January 200
February 300
March 200
April 200
May 300
June 400
July 400
August 300
September 400
October 300
November 400
December 200
Total show the total
Average show the average
データのインポートと正しく出力に問題があります。構文をクリーンアップするためにシェルチェックを試しましたが、問題が発生しました。コードは次のとおりです。
#!bin/bash
awk >>practicefile.output
BEGIN{
print "Month\tSales"
print "-----\t-----"
{ Month[$1] = $2; next }
{ lines[(Month[$1])] = $1 (Month[$1]) $2 }
END {
for (i=1; i<=7; i++) {
if (lines[sales[i]])
print lines[month[i]]
else
print month, sales[i]
fi
}
}
答え1
希望の出力を得ました
Month Sales
----- -----
January 200
February 300
March 200
April 200
May 300
June 400
July 400
August 300
September 400
October 300
November 400
December 200
Total 3600
Average 300
次のスクリプトを使用してください(別名で保存test.awk
)。
BEGIN {
print "Month Sales"
print "----- -----"
}
{ printf "%-9s %s\n", $1, $2 }
{ sum += $2 }
END {
printf "\nTotal %s\n", sum
printf "\nAverage %s\n", sum / NR
}
そしてそれをそう呼んでくださいsort -k1,1M input.txt | awk -f test.awk
。
説明:printf "%-9s", $1
文字列()に$1
最大9文字のパディング(スペースを含む)を追加します。sort -k1,1M
入力を月ごとに並べ替えます。まったく奇妙ではありませんが、はるかに簡単です。