AWK:条件を満たす任意のファイルラインを取得しますか?

AWK:条件を満たす任意のファイルラインを取得しますか?

条件を満たす任意の行セットを取得しようとしています。

たとえば、私のファイルが次のような場合:

a    1    5
b    4    12
c    2    3
e    6    14
f    7    52
g    1    8

次に、列3と列2の差が3より大きく10より小さい、正確に2つのランダムな行が必要です(たとえば、a、b、e、gで始まる行が適しています)。

この問題にどのように対処する必要がありますか?

awk (if something and random) '{print $1,$2,$3}'

ベストアンサー1

これを行うこともできますが、awk行をランダムに選択するのは複雑で多くのコードが必要です。awkあなたの基準に一致する行を取得し、標準ツールを使用してランダムに選択するためにshuf使用します。

$ awk '$3-$2>3 && $3-$2 < 10' file | shuf -n2
g    1    8
a    1    5

数回実行すると、ランダムに選択された行が表示されます。

$ for i in {1..5}; do awk '$3-$2>3 && $3-$2 < 10' file | shuf -n2; echo "--";  done
g    1    8
e    6    14
--
g    1    8
e    6    14
--
b    4    12
g    1    8
--
b    4    12
e    6    14
--
e    6    14
b    4    12
--

このshufツールはGNU coreutilsの一部であるため、ほとんどのLinuxシステムにデフォルトでインストールする必要があり、ほとんどの* nixで簡単に使用できます。

おすすめ記事