首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash嵌套管道和通配符

Bash嵌套管道和通配符
EN

Stack Overflow用户
提问于 2022-08-17 21:26:59
回答 4查看 70关注 0票数 0

我有输入文件foo1.txtfoo2.txtfoo3.txt等。我有一些处理输入文件的命令munge,但是(由于这里不相关的原因)该命令一次只能处理一个输入文件。我想将输出合并到一个out.txt中。

我知道我可以做cat foo*.txt来连接所有输入文件,但是如前所述,munge只能在每个单独的文件上工作。也就是说,munge不会喜欢我做cat foo*.txt | munge > out.txt的。相反,在连接输出之前,我需要对每个文件执行处理。

我确信我可以使用for循环输入文件,但是如何组合输出呢?

基本上,我是在寻找类似于此的东西,而无需事先枚举所有输入文件。

代码语言:javascript
复制
cat foo1.txt | munge > out1.txt
cat foo2.txt | munge > out2.txt
cat foo2.txt | munge > out2.txt
cat out*.txt > out.txt

我敢打赌,有一些非常简单的命令可以在一行中为我做到这一点,也许可以使用嵌套的管道和通配符。有什么想法吗?

EN

回答 4

Stack Overflow用户

发布于 2022-08-17 21:34:53

使用循环并将整个循环的输出重定向到out.txt。并且不需要从cat进行管道传输,您可以简单地将输入重定向到文件。

代码语言:javascript
复制
for file in foo*.txt; do
    munge < "$file"
done > out.txt
票数 5
EN

Stack Overflow用户

发布于 2022-08-17 21:50:00

首先,您有cat (UUoC)的无用用途:

代码语言:javascript
复制
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

做得更简单,如:

代码语言:javascript
复制
< foo1.txt munge > out1.txt
< foo2.txt munge > out2.txt
< foo3.txt munge > out3.txt
cat out*.txt > out.txt

更常见的是,所有重定向都出现在命令之后,但这并不是必需的:

代码语言:javascript
复制
munge < foo1.txt > out1.txt
munge < foo2.txt > out2.txt
munge < foo3.txt > out3.txt
cat out*.txt > out.txt

在Bash中,可以使用进程替换来将它们组合在一起,就像这样,但是当最终的组合器只是连环化时,这就太复杂了:

代码语言:javascript
复制
# useless use of process substitution plus cat (uuopspcat)
cat <(munge < foo1.txt) <(munge < foo2.txt) <(munge < foo3.txt) > out.txt

可以这样做:通过圆括号操作符运行子subshell中的程序,并将该子subshell的输出重定向到合并的文件中。

代码语言:javascript
复制
(munge < foo1.txt ; munge < foo2.txt ; munge < foo3.txt) > out.txt

如果munge是一个“连锁的线性算子”,松散地说,那么应该可以这样做:

代码语言:javascript
复制
cat foo1.txt foo2.txt foo3.txt | munge > out.txt

例如,如果munge类似于grep foo,则此转换是有效的。实现grep输出的加时针与对链接后的输入打招呼是一样的。

如果可以将munge扩展为接受多个文件名参数并对它们进行迭代,则只需:

代码语言:javascript
复制
munge foo1.txt foo2.txt foo3.txt > out.txt
票数 0
EN

Stack Overflow用户

发布于 2022-08-18 00:48:38

假设munge可以使用文件名参数:

代码语言:javascript
复制
printf '%s\0' foo*.txt | xargs -0 -n 1 munge > out.txt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73395075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档