あるディレクトリに複数のファイルがあり、フォーマットが異なるファイルはほとんどありません。指定された形式があるものとそうでないものを区別したいと思います。 500を超えるファイルがあるため、手動で実行するのに時間がかかるため、どのような種類のbashアプローチが最善だと思います。
ディレクトリの例、
hello.txt
example.txt
world.txt
...
必須形式の例、
Hello \t World \t Hi
私が望むのは、目的の形式のファイルを別のフォルダに移動および/またはコピーすることです。
条件付き方法は次のとおりです。
awk -F"\t" {' $1 ~ "[a-zA-Z] && $2 ~ "[a-zA-Z]" && $3 ~ "[a-zA-Z]" && NF < 5}
だからこのアプローチでは
$1 contains alpha
$2 contains alpha
$3 contains alpha
and the number of delimiters are below 5 ( incase )
これは最小限の調整で単一のファイルに対して機能しますが、ディレクトリ内のすべてのファイルを処理し、各ファイルスキャンの各行の処理速度を遅くするには、スキャンを1行または2行以上に設定できます。
答え1
GNUを使用すると、awk
次mv
のことができます。
gawk -F'\t' -v ORS='\0' '
NF < 5 && $1 ~ /[[:alpha:]]/ && $2 ~ /[[:alpha:]]/ && $3 ~ /[[:alpha:]]/ {
print FILENAME; nextfile
}' ./*.txt | xargs -r0 mv -t destination-directory
destination-directory
名前は次に終わり、.txt
5つ未満のフィールド(区切り記号4つ未満)を含む少なくとも1行を含み、最初の3つのフィールドに少なくとも1つのアルファベット文字を含む(非表示)ファイルに移動します。
grep
これは次のようにGNUを介して行うこともできますmv
。
grep -lZxP '([^\t]*[[:alpha:]][^\t]*)\t(?1)\t(?1)(\t[^\t]*)?' ./*.txt |
xargs -r0 mv -t destination-directory