Bash 1行のコードまたはスクリプトを使用してファイルのテーブルの内容を解析します。

Bash 1行のコードまたはスクリプトを使用してファイルのテーブルの内容を解析します。

私はしばらくLinuxコマンドを使用してログファイル(下に貼り付けた形式)を並べ替える方法を見つけようとしましたが、うまくいきません。このファイルの設定は次のとおりです。

columnA | colB | colC | colD  
name_1| data | 1   | data
name_1| data | 2   | data
name_1| data | 3   | data
name_2| data | 1   | data
name_2| data | 2   | data

C列の最高値と最高値を持つ行のcolC内の他の列の対応するデータに基づいて、A列の各名前に対して1つの項目のみを含むファイルを持ちたいと思います。

誰かがコマンドやパイプラインを知っていれば、大いに感謝します。

ありがとう

ベストアンサー1

$ awk -F'|' '
  NR==1 { header=$0 };
  NR>1 && ($3 > colC[$1]) { colC[$1] = $3 ; line[$1] = $0};

  END {
    print header;
    for (i in line) { print line[i] }
  }' file.log 
columnA | colB | colC | colD
name_1| data | 3   | data
name_2| data | 2   | data

このスクリプトは|フィールド区切り文字を使用してawk変数の最初の行を保存し、配列を使用して列A headercolC$1の各値と列Cに表示される最も高い値($ 3)を格納します。この配列は、line一致する入力行全体($0)を格納するためにも使用されます。

最後に、すべての入力を読み取って処理すると、保存された各行が印刷されます。連想配列は指定された順序で保存されないため、出力をソートする必要がありますsort。出力をにパイプします。入力ファイルによっては、ヘッダー行が出力の途中または末尾に揃うことがあります。そのような場合は、スクリプトに保存または印刷するのではなく、awkスクリプトに印刷することをお勧めします。 awk スクリプトを実行するシェルスクリプトです。

メモ:このアルゴリズムを最適化する方法はいくつかあります。私は読みやすさとシンプルさのために最適化する方法を選択しました。入力ファイルの長さが数百万または数十億行でない限り、パフォーマンスとメモリ消費量は最適化する価値がある問題ではありません。

おすすめ記事