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/
。