根据文件名中的数字按特定顺序排列 cat 文件

根据文件名中的数字按特定顺序排列 cat 文件

我有名为file.88_0.pdb, file.88_1.pdb, ...,的文件file.88_100.pdb。我想要cat它们,以便在、之后等等file.88_1.pdb之后粘贴。如果我这样做,文件将按以下顺序放在一起:等。我如何将它们放在一起以便顺序是?file.88_0.pdbfile.88_2.pdbfile.88_1.pdbcat file.88_*.pdb > all.pdb0 1 10 11 12 13 14 15 16 17 18 19 2 20...0 1 2 3 4 5 6...

答案1

使用brace expansion

cat file.88_{0..100}.pdb >>bigfile.pdb

要忽略打印不存在文件的错误消息,请使用:

cat file.88_{0..100}.pdb >>bigfile.pdb 2>/dev/null

zshshell 中,您还可以使用(n)globbing 限定符来请求数值排序(与默认的按字母顺序排列的) 对于全局:

cat file.88_*.pdb(n) >>bigfile.pdb 2>/dev/null

答案2

在不带大括号扩展的 shell 中,如果文件名不包含空格、引号或反斜杠,则可以使用ls(假设是 GNU 实现)+ xargs

ls -v file.88_*.pdb | xargs cat > all.pdb

ls将按数字顺序对文件进行排序:

-v 文本中的(版本)数字的自然排序。

答案3

cat $(for((i=0;i<101;i++)); do echo -n "file.88_${i}.pdb "; done)

或者,关于 Jesse_b 的评论:

cat $(for((i=0;i<101;i++)); do test -f "file.88_${i}.pdb" && echo -n "file.88_${i}.pdb "; done)

答案4

尝试:

filedir="/path/to/files"
output="/path/to/all.pdb"
for file in $(find $filedir -type f -name "file.88_*" | sort -t "_" -k2 -n); do
    cat $file >> $output
done

这能够sort将 ( -k2) 第二个字段用作_分隔符。这里你必须使用>>,否则每个新文件都会覆盖上一个。

相关内容