特定の条件に基づいてファイルからテキストを抽出する

特定の条件に基づいてファイルからテキストを抽出する

次の履歴を含むファイルがあります。

434419\Teclu\Tudor\1501\9502
187650\Cosma\Sorin\1504\9253
239474\Teclu\Daniel\1502\5245
844936\Gaman\Mihai\1505\4074
942341\Avram\Tudor\1505\4543
137158\Gaman\Marius\1505\5244
531747\Francu\Daniel\1503\2226
382144\Teclu\Daniel\1501\9943
913409\Gaman\Mihai\1501\5473
901028\Avram\Mihai\1502\6169
382207\Dedu\Alex\1504\5428
726697\Gaman\Sorin\1502\5071
271503\Gaman\Ionut\1505\6643
147791\Dedu\Dragos\1503\4955
495572\Cosma\Alex\1505\9750
769482\Popescu\Sorin\1505\5472
410724\Marin\Mihai\1502\7317
381000\Marin\Daniel\1503\7321
251934\Popescu\Ionut\1504\8288
416161\Gaman\Mihai\1501\8245
523401\Gaman\Mihai\1504\3101
347491\Avram\Daniel\1504\2017
329372\Dedu\Sorin\1502\8528
509554\Popescu\Ionut\1502\7972

\で区切られたフィールド。最初のフィールドはID、2番目のフィールドは姓、3番目のフィールドは名前、4番目のフィールドは給与、5番目のフィールドは姓です。

1 つのパラメーター (つまり、姓) を使用して、ファイルの最初と最後の 10 行で、その名前を持つ人を検索するスクリプトを作成する必要があります。次に、これらの人物の中で最も給与の低い人を選択するか、同じ名前と給与の人が2人以上いる場合は、パフォーマンススコアを比較してスコアが高い人を選択します。この人の場合は、身分証明書を印刷する必要があります。

私は頭と尾のトリミングの組み合わせとより多くのコマンドを試しました。

{ head -n 10 file.txt ; tail -n 10 file.txt } | grep $NAME | sort -t '\' -r k 4

給与が低いものから高いものの順に並べておきましたが、給与が同じであれば次にはどうすべきかわかりません。

ベストアンサー1

コマンドの先頭を保持します。

{ head -n 10 file.txt ; tail -n 10 file.txt; } |
grep $NAME | sort -t '\' -k 4 -k 5 |
awk -F'\\' '!wage{wage=$4;id=$1;next} wage==$4{id=$1} END{print id}'

これawkスクリプトは、デフォルトでユーザーが提供したアルゴリズムのテキスト記述を取得し、数式に入れます。

もちろん、パイプラインの最初の3つのコマンドをより多くのawkロジックに置き換えることもできます。たとえば、次のようになります。

$ myFun() {
    awk -F'\\' -v s=$2 -v l=`wc -l<$1` '
      $2==s&&(NR<11||NR>l-11)&&(!wage||wage>$4||(wage==$4&&$5>perf)){
        wage=$4; id=$1; perf=$5;
      }
      END{ print id; }' $1; }
$ myFun exampleData.dsv Teclu
382144
$ myFun exampleData.dsv Gaman
416161

コメント内のOPを参照してください: '$1'、 '$2'など、awkの変数は同じ名前のシェル変数とは無関係です。

おすすめ記事