我有一堆名为uv_set_XXXXXXXX
的文件,其中6个X代表常规格式的年,月和日。想象一下,我有325个此类文件。我想按50个文件的组进行连接,因此最终我有7个文件(6个文件,分别为50个和25个中的1个)。
我一直在考虑使用cat
,但看不到从列表中选择多个文件的选项。我可以使用Python做到这一点,但是只是想知道是否某些Unix命令行实用程序可以更直接地做到这一点。
谢谢。
答案 0 :(得分:3)
对于GNU并行,您可以使用以下命令
parallel -n50 "cat {} > out{#}" ::: uv_set_*
这会将前50个文件合并到out1
中,接下来的50个文件合并到out2
中,依此类推。
答案 1 :(得分:1)
我会分解并在Awk中执行此操作。
awk 'FNR==1 && (++i%50 == 0) {
if(NR>1) close p;
p = "dest_" ++j }
{ print >p }' uv_set_????????
这将创建文件dest_1
至dest_7
,前6个文件中每个文件包含50个文件,最后一个文件中包含其余文件。
必须关闭前一个文件,因为系统仅允许Awk具有有限数量的打开文件句柄(尽管该限制通常高于7,因此在您的示例中可能并不重要)。
大声思考部门,只是为了防止其他人浪费时间重复这种死胡同。
您可以一次使用xargs -L 50 cat
来串联50个文件,但是没有简单的方法为每次调用为标准输出传递新的重定向。您可以尝试通过类似
# XXX Do not use: incomplete
printf '%s\n' uv_set_???????? |
xargs -L 50 sh -c 'cat "$@" > ... something' _
但是我无法提出一种优雅的方法来每次设置一个不同的something
。