我想按照其他文件中的特定顺序连接多个文件。
我有多个文件,freq_<something>
我想连接它们。 “某事”列在另一个名为“列表”的文件中。
这是我的清单:
$ cat list
003137F
002980F
002993F
我想要做:
cat freq_003137F freq_002980F freq_002993F > freq_all
但我的列表包含数百个值,所以我无法真正做到这一点!
有什么方法可以实现自动化?我以为我可以附加一个带有 a 的文件,while read line
但它失败了......
谢谢!
中号
答案1
使用xargs
xargs -i cat freq_'{}' < list > freq_all
答案2
你可以用 a 来做到这一点while
,为什么不呢?这应该有效:
while read suffix; do cat freq_"${suffix}"; done < list > freq_all; done
或者,您可以使用以下命令生成命令printf
并手动运行它:
$ echo "cat $(printf 'freq_%s ' $(cat list)) > freq_out"
cat freq_003137F freq_002980F freq_002993F > freq_out
或者直接执行:
cat $(printf 'freq_%s ' $(cat list)) > freq_out
答案3
如果您要使用 xargs,通常您希望利用它在单个进程的命令行上放置多个 arg 的能力。 (考虑到进程启动开销,运行cat
对其参数进行循环的进程比为每个文件运行单独的进程更有效)。cat
xargs '-I{}' cat freq_'{}'
不幸的是,暗示-x
-L 1
,并且拒绝允许重写它以执行每个命令的多个参数。
相反,我们可以使用sed
来进行替换。如果你有一个,这可能会很好非常大列表,对于 @terdon 的答案中用 printf 替换 bash 命令来说可能太大了。 xargs 知道将 args 批处理成最多 128kiB 的文本块(默认情况下)。
sed 's/^/freq_/' list | xargs -d'\n' cat > freq_out
s/^/foo/
将内容添加到行的开头。该模式在每行的开头匹配 0 宽度。