使用基于另一个文件的特定顺序连接文件

使用基于另一个文件的特定顺序连接文件

我想按照其他文件中的特定顺序连接多个文件。

我有多个文件,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 宽度。

相关内容