ファイルの内容で番号の範囲を見つけ、その番号の範囲を含むファイルを別のディレクトリに移動するにはどうすればよいですか?

ファイルの内容で番号の範囲を見つけ、その番号の範囲を含むファイルを別のディレクトリに移動するにはどうすればよいですか?

OK、約90個のファイルがあり、各ファイルの本文は次のとおりです。

187942           78.9

2番目の列の値が70から90のファイルをフィルタリングして別のディレクトリに移動したいと思います。

答え1

小さなスクリプトを使用して、awk良いファイルと悪いファイルを区別できます。たとえば、次のようになります。

#!/bin/bash
mkdir -p another-directory
for f in * ; do 
    if ! awk '$2>=70 && $2<=90 { exit 1; }' "$f" ; then
        mv -- "$f" another-directory/
    fi
done

ここで重要なのは、これがexit 1失敗の終了であることです。したがって、条件文withは、awk単に2番目のトークンが70から90(含む)の数である行の存在を検出します。それ以外の場合はawk正常に終了して成功します。感嘆符はこれを否定し、ファイルに良い行がある場合は条件をtrueにし、それ以外の場合はfalseにします。

答え2

使用awk:

awk '$2>70&&$2<90&&!a[FILENAME]++{printf("%s%c",FILENAME,0)}' * | xargs -0 cp -vt target/ --

説明する:

  • $2>70&&$2<90状態。
  • !a[FILENAME]++ファイル名が一意の場合はtrueです(ファイル名は一度だけ印刷されます)。
  • printf("%s%c",FILENAME,0)特殊ファイル名を処理するには、ヌルバイト区切り文字を使用してファイル名を印刷します。
  • xargs -0ヌルバイトで区切られたファイル名を読み取ります。
  • cp -vt target/ --ファイルをディレクトリにコピーしますtarget/

関連情報