【发布时间】:2014-08-02 09:55:26
【问题描述】:
如果我有一堆文件标记如下:
fasta_Watson_0
fasta_Watson_1
fasta_Watson_2
...
fasta_Watson_190
如何编写一个 awk 脚本来自动将所有文件连接成一个文件?
手写输入:
cat fasta_Watson_0 fasta_Watson_1 ...
实在是太乏味了!
【问题讨论】:
如果我有一堆文件标记如下:
fasta_Watson_0
fasta_Watson_1
fasta_Watson_2
...
fasta_Watson_190
如何编写一个 awk 脚本来自动将所有文件连接成一个文件?
手写输入:
cat fasta_Watson_0 fasta_Watson_1 ...
实在是太乏味了!
【问题讨论】:
您可以使用bash wildcards,但您必须担心排序顺序。可能会做类似this post 上建议的事情。
cat `ls fasta_Watson_* |sort -n -t "_" -k 3`
【讨论】:
0, 1, 10, 11, ..., 2, 20, ..., 3, etc。
ls 加入其中,而不仅仅是echo?还有为什么 subshell 和 cat?
ls -v (GNU ls) 会按所需顺序列出文件。该解决方案不是可移植的; ls -v 在 Mac OS X 上有不同的含义(根据 POSIX,没有指定含义)。
到cat他们都按数字顺序并将结果保存在一个名为output的文件中,使用:
cat fasta_Watson_{0..190} >output
{0..190} 构造是一个代表从 0 到 190 的所有数字的 bashism。如果您的 shell 不支持,您可以使用标准实用程序 seq:
cat $(seq -f 'fasta_Watson_%g' 0 190) > output
【讨论】:
cat $(seq -f 'fasta_Watson_%g' 0 190) > output,它使用seq 的-f 选项来显式生成名称,而无需shell 循环(节省cat 的执行次数)。这个答案(和我的变体)取决于文件的数量是否足够小,以至于列表不会超出对命令的参数列表长度的限制。