我在一个目录少数中有多个文件,格式不同。我希望将具有指定格式的那些与那些没有的分开。有超过 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 行等。
使用 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
Run Code Online (Sandbox Code Playgroud)
这将移动到destination-directory名称以.txt并包含至少一行少于 5 个字段(少于 4 个分隔符)且前 3 个字段包含至少一个字母字符的(非隐藏)文件。
这也可以用 GNUgrep和mv:
grep -lZxP '([^\t]*[[:alpha:]][^\t]*)\t(?1)\t(?1)(\t[^\t]*)?' ./*.txt |
xargs -r0 mv -t destination-directory
Run Code Online (Sandbox Code Playgroud)