Bash/Awk 文件排序

use*_*555 5 shell awk files

我在一个目录少数中有多个文件,格式不同。我希望将具有指定格式的那些与那些没有的分开。有超过 500 个文件,这使得手动操作非常耗时,所以我认为某种形式的 bash 方法是最好的。

目录示例,

hello.txt
example.txt
world.txt
...
Run Code Online (Sandbox Code Playgroud)

所需格式的示例,

Hello \t World \t Hi
Run Code Online (Sandbox Code Playgroud)

我希望做的是将具有所需格式的文件移动和/或复制到单独的文件夹中。

有条件的方法将类似于:

awk -F"\t" {' $1 ~ "[a-zA-Z] && $2 ~ "[a-zA-Z]" && $3 ~ "[a-zA-Z]" && NF < 5}
Run Code Online (Sandbox Code Playgroud)

所以在那种方法中

$1 contains alpha
$2 contains alpha
$3 contains alpha
and the number of delimiters are below 5 ( incase )
Run Code Online (Sandbox Code Playgroud)

这将适用于具有最小调整的单个文件,但我需要它来处理目录中的每个文件,并减慢每个文件检查的每一行的处理速度,检查可以设置为第 1 行或第 2 行等。

Sté*_*las 6

使用 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
Run Code Online (Sandbox Code Playgroud)

这将移动到destination-directory名称以.txt并包含至少一行少于 5 个字段(少于 4 个分隔符)且前 3 个字段包含至少一个字母字符的(非隐藏)文件。

这也可以用 GNUgrepmv

grep -lZxP '([^\t]*[[:alpha:]][^\t]*)\t(?1)\t(?1)(\t[^\t]*)?' ./*.txt |
  xargs -r0 mv -t destination-directory
Run Code Online (Sandbox Code Playgroud)