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名称以 结尾.txt且至少包含一行少于 5 个字段(少于 4 个分隔符)且前 3 个字段包含至少一个字母字符的(非隐藏)文件。

grep这也可以通过 GNU和以下方式完成mv

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

相关内容