awk を使用してテキスト データ統計を簡単に操作する

まず、awk プログラムの基本的な構造である pattern { action } を見てみましょう。基本的な操作は、テキストを 1 行ずつスキャンし、パターンに一致する行を見つけて、対応するアクションを実行することです。すべての行が読み取られた後に終了します。

まず最も単純な例を見てみましょう。trace.log ファイルには、名前、年齢、勤続年数が含まれています。
星 25 1
月 32 5
太陽 29 3
川 27 4
湖 30 6
海 35 8

ここで、勤続 5 年以上の従業員 (行全体) を検索したいとします。これは 1 つの文で実行できます。必要な式をパターン部分に直接記述します。行全体を識別するために $0 が使用されます。 。

awk '$3 >= 5 {print $0}' trace.log

1 件
の結果:
月 32 5
湖 30 6
海 35 8

出力に行番号を追加したい場合は、Awk には組み込み変数 NR が用意されていますが、それほど多くはありません。

awk '$3 >= 5 {print NR,$0}' trace.log

1 件
の結果:
2 月 32 5
5 湖 30 6
6 海 35 8

printf を使用して出力をフォーマットしたい場合は、それはあなた自身の責任です。

awk '$3 >= 5 {printf("name: %s,age: %d \n",$1,$2)}' trace.log

1 件
の結果 Jiang Zi:
名前: 月、年齢: 32
名前: 湖、年齢: 30
名前: 海、年齢: 35

通常、awk を使用する場合、必要なセグメント化されたデータを出力するアクションしかありませんが、実はまだパターンにコツがあり、moon という名前のデータだけを見たいだけです。

awk '$1 == "moon"' trace.log        # moon 32 5

1 つの
パターンは、! ではなく括弧、&&、または || を使用して組み合わせることができます。

awk '$2 >30 && $3 >= 8' trace.log    # sea 35 8

1
ここまで言っても、まだ面白くありません。統計が役に立つかもしれません。まず、次の 2 点を理解する必要があります。END キーワードは、最終行の後の位置を一致させるために使用されます。計算用の独自の変数がありますが、その必要はありません。5 年以上働いている人が何人いるか知りたいですか?

awk '$3 >= 5 {total += 1} END {print "超过5年:",total,"人"}' trace.log

1
行ごとにスキャンすることはループのようなもので、ループ中にパフォーマンス (計算) を開始し、END で最後の行と一致し、その後いくつかのアクションを実行します。

合計する方法がわかったので、従業員の平均年齢を確認したいと思います。NR が行数を記録していることを忘れないでください。

awk '{total += $2} END {print total/NR}' trace.log

1.
一般的な年齢レベルを確認したい場合は、おそらく中央値の方が代表的であるため、最初に並べ替える必要があります。

awk '{print $2," ", $3," " $1}' trace.log | sort

1
次に、中央の位置にあるデータを見つければOKです

awk '{print $2," ", $3," " $1}' trace.log | sort | awk '{line[NR] = $1} END {print line[int(NR/2)]}'

1.
年齢の最大値と最小値も確認したいとします。上記の経験を踏まえ、あまり厳密に考えすぎないようにしてください。

awk '{print $2," ", $3," " $1}' trace.log | sort | awk '{line[NR] = $0} END {print line[1],"\n",line[NR]}'

記載されていないキーワードとして、END と同様の BEGIN もありますが、詳しくは説明しませんので、図にまとめてみましょう。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_43275277/article/details/125105301