我有输入文件foo1.txt、foo2.txt、foo3.txt等。我有一些处理输入文件的命令munge,但是(由于这里不相关的原因)该命令一次只能处理一个输入文件。我想将输出合并到一个out.txt中。
我知道我可以做cat foo*.txt来连接所有输入文件,但是如前所述,munge只能在每个单独的文件上工作。也就是说,munge不会喜欢我做cat foo*.txt | munge > out.txt的。相反,在连接输出之前,我需要对每个文件执行处理。
我确信我可以使用for循环输入文件,但是如何组合输出呢?
基本上,我是在寻找类似于此的东西,而无需事先枚举所有输入文件。
cat foo1.txt | munge > out1.txt
cat foo2.txt | munge > out2.txt
cat foo2.txt | munge > out2.txt
cat out*.txt > out.txt我敢打赌,有一些非常简单的命令可以在一行中为我做到这一点,也许可以使用嵌套的管道和通配符。有什么想法吗?
发布于 2022-08-17 21:34:53
使用循环并将整个循环的输出重定向到out.txt。并且不需要从cat进行管道传输,您可以简单地将输入重定向到文件。
for file in foo*.txt; do
munge < "$file"
done > out.txt发布于 2022-08-17 21:50:00
首先,您有cat (UUoC)的无用用途:
cat foo1.txt | munge > out1.txt
cat foo2.txt | munge > out2.txt
cat foo3.txt | munge > out3.txt # I assume you wanted 3 here
cat out*.txt > out.txt做得更简单,如:
< foo1.txt munge > out1.txt
< foo2.txt munge > out2.txt
< foo3.txt munge > out3.txt
cat out*.txt > out.txt更常见的是,所有重定向都出现在命令之后,但这并不是必需的:
munge < foo1.txt > out1.txt
munge < foo2.txt > out2.txt
munge < foo3.txt > out3.txt
cat out*.txt > out.txt在Bash中,可以使用进程替换来将它们组合在一起,就像这样,但是当最终的组合器只是连环化时,这就太复杂了:
# useless use of process substitution plus cat (uuopspcat)
cat <(munge < foo1.txt) <(munge < foo2.txt) <(munge < foo3.txt) > out.txt可以这样做:通过圆括号操作符运行子subshell中的程序,并将该子subshell的输出重定向到合并的文件中。
(munge < foo1.txt ; munge < foo2.txt ; munge < foo3.txt) > out.txt如果munge是一个“连锁的线性算子”,松散地说,那么应该可以这样做:
cat foo1.txt foo2.txt foo3.txt | munge > out.txt例如,如果munge类似于grep foo,则此转换是有效的。实现grep输出的加时针与对链接后的输入打招呼是一样的。
如果可以将munge扩展为接受多个文件名参数并对它们进行迭代,则只需:
munge foo1.txt foo2.txt foo3.txt > out.txt发布于 2022-08-18 00:48:38
假设munge可以使用文件名参数:
printf '%s\0' foo*.txt | xargs -0 -n 1 munge > out.txthttps://stackoverflow.com/questions/73395075
复制相似问题