Bash/Awk ファイルの並べ替え

Bash/Awk ファイルの並べ替え

あるディレクトリに複数のファイルがあり、フォーマットが異なるファイルはほとんどありません。指定された形式があるものとそうでないものを区別したいと思います。 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を使用すると、awkmvのことができます。

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名前は次に終わり、.txt5つ未満のフィールド(区切り記号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

おすすめ記事