我在目录中有多个(超过100个)文本文件,例如
files_1_100.txt
files_101_200.txt
该文件的内容是一些变量的名称,如files_1_100.txt包含一些介于1到100之间的变量名称
"var.2"
"var.5"
"var.15"
类似地,files_201_300.txt包含101到200之间的一些变量
"var.203"
"var.227"
"var.285"
和files_1001_1100.txt一样
"var.1010"
"var.1006"
"var.1025"
我可以使用命令合并它们
cat files_*00.txt > ../all_files.txt
但是,文件的内容不遵循父文件中的内容.例如all_files.txt显示
"var.1010"
"var.1006"
"var.1025"
"var.1"
"var.5"
"var.15"
"var.203"
"var.227"
"var.285"
那么,我如何确保file_1_100.txt的内容首先出现,然后是files_201_300.txt,然后是files_1001_1100.txt,以便all_files.txt的内容是
"var.1"
"var.5"
"var.15"
"var.203"
"var.227"
"var.285"
"var.1010"
"var.1006"
"var.1025"
解决方法:
让我尝试一下,但我认为这会奏效:
ls file*.txt | sort -n -t _ -k2 -k3 | xargs cat
我们的想法是获取文件列表并对它们进行排序,然后将它们传递给cat命令.
排序使用了几个选项:
> -n – 使用数字排序而不是字母
> -t _ – 使用下划线字符将输入(文件名)分成字段
> -k2 -k3 – 首先按第2个字段排序,然后按第3个字段排序(2个数字)
您已经说过您的文件名为file_1_100.txt,file_101_201.txt等.如果这意味着(因为它似乎表明)第一个数字“块”始终是唯一的,那么您可以不使用-k3标志.只有当您最终使用file_100_2.txt和file_100_10.txt时才需要该标志,您必须查看第二个数字“块”以确定首选顺序.
根据您使用的文件数量,您可能会发现指定glob(文件* .txt)可能会使shell崩溃并导致该行的错误太长.如果是这样的话,你可以这样做:
ls | grep '^file.*\.txt$' | sort -n -t _ -k2 -k3 | xargs cat