次のような多くの行を含むファイルがあります。
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 -E
GNU 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と互換性がなければなりません。