与えられた列に与えられた値を持つファイルから行を選択するエレガントな方法ですか?

与えられた列に与えられた値を持つファイルから行を選択するエレガントな方法ですか?

次のような多くの行を含むファイルがあります。

0       file:/home/knappen/somefilename.txt  7       0.2838356973995272      19      0.21823286052009455     18      0.10121158392434988     15      0.07816193853427897     11
  0.07284278959810875     6       0.056885342789598115    8       0.03738179669030733     22      0.032062647754137114    23      0.01610520094562648     12      0.01610520094562648     16      0.010786052009456266    0       0.010786052009456266    13      0.009013002364066195    5       0.009013002364066195    10      0.007239952718676124    9       0.007239952718676124    14      0.005466903073286052    4       0.005466903073286052    21      0.003693853427895981    20      0.003693853427895981    17      0.003693853427895981    3       0.003693853427895981    2       0.003693853427895981    1
   0.003693853427895981

3番目の列の項目が与えられた数など、すべての行を選択したいと思います。

私はこの目的のためのパターンやこの効果を持つ小さなPythonまたはPerlスクリプトを書く方法を知っていますが、grep -EGNU coreutilsを使用するエレガントなソリューションがあるかどうか疑問に思います。

PS:この質問で良い提案を含む答えが見つかりました。列値に基づいてCSVファイルから行を選択するしかし、これらのツールはGNU coreutilsの範囲外です。そこに出てきた答えは私に役立つのに十分でした。しかし、シェルユーティリティの強力な機能についてさらに学ぶために、とにかくこの質問をします。

ベストアンサー1

Awk非常に強力なテキストの書式設定/操作とパターンマッチングツールです。デフォルトは、単一のスペースであるカスタム区切り文字を使用してファイル内の各行を区切ります。分割後、行の最後の列番号がある$1,$2..$N場所から個々のフィールドにアクセスできます。N

したがって、お客様の要件に応じて、3番目の列を必要な値と一致させます。

awk '$3 == "string"' file 

たとえば、ファイルが区切り文字が異なるCSVの場合は、,次のように定義します。

awk -v FS="," '$3 == "string"' file

これはGNUに限定されず、awkそのバリエーションは* nixシステムで動作し、POSIXと互換性がなければなりません。

おすすめ記事