首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用xargs或并行将路径中的多个文件与*连接起来

如何使用xargs或并行将路径中的多个文件与*连接起来
EN

Unix & Linux用户
提问于 2022-01-19 15:07:27
回答 3查看 318关注 0票数 -1

我有一个命令,为CSV文件中的每一行获取一个文件路径:

代码语言:javascript
运行
复制
awk -F, 'NR>0 {print "/mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/" $2 "_*/dragen-covidseq/" $1 "_*_ds*/consensus/*.consensus_hard_masked_sequence.fa"}' input.csv

input.csv文件示例:

代码语言:javascript
运行
复制
2071404446,RUN111
2071405093,RUN111
2071405134,RUN111

此命令之后的详细示例:

代码语言:javascript
运行
复制
/mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/RUN111_*/dragen-covidseq/2071404446_*_ds*/consensus/*.consensus_hard_masked_sequence.fa
/mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/RUN111_*/dragen-covidseq/2071405093_*_ds*/consensus/*.consensus_hard_masked_sequence.fa
/mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/RUN111_*/dragen-covidseq/2071405134_*_ds*/consensus/*.consensus_hard_masked_sequence.fa

现在,我想将不同文件的所有内容连接到一个文件中。我尝试了以下简单的管道命令:

代码语言:javascript
运行
复制
awk -F, 'NR>0 {print "/mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/" $2 "_*/dragen-covidseq/" $1 "_*_ds*/consensus/*.consensus_hard_masked_sequence.fa"}' input.csv | xargs cat > output.fasta

但是我有“没有这样的文件或目录”错误,因为xargs似乎将*解释为一个字符,而不是通配符。关于信息,除了*,我没有空间或任何空间字符在我的道路上。

你知道怎么做吗?

EN

回答 3

Unix & Linux用户

发布于 2022-01-19 15:57:20

如果要将*字符展开为shell glob字符(通配符),则必须将它们传递给执行此操作的程序,例如shell。

假设输入文件的字段不包含对shell具有特殊意义的其他字符,则可以尝试(1):

代码语言:javascript
运行
复制
awk -F, 'NR>0 {print "cat /mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/" $2 "_*/dragen-covidseq/" $1 "_*_ds*/consensus/*.consensus_hard_masked_sequence.fa"}' input.csv | sh > output.fasta

awk命令打印像cat /path/with/wildcards/to/some/file这样的命令,这些命令通过管道传输到shell以进行解释。如果要避免对每个文件运行单独的cat进程,可以让shell打印文件名并将其传递给xargs (2):

代码语言:javascript
运行
复制
awk -F, 'NR>0 {print "echo /mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/" $2 "_*/dragen-covidseq/" $1 "_*_ds*/consensus/*.consensus_hard_masked_sequence.fa"}' input.csv | sh | xargs cat > output.fasta

当我使用问题中所示的输入文件从(1)运行awk命令时,awk命令的输出是

代码语言:javascript
运行
复制
cat /mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/RUN111_*/dragen-covidseq/2071404446_*_ds*/consensus/*.consensus_hard_masked_sequence.fa
cat /mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/RUN111_*/dragen-covidseq/2071405093_*_ds*/consensus/*.consensus_hard_masked_sequence.fa
cat /mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/RUN111_*/dragen-covidseq/2071405134_*_ds*/consensus/*.consensus_hard_masked_sequence.fa

注意,输出行以cat开头(与问题中的awk命令相反)。

我无法通过shell测试*字符的扩展,因为我没有任何与模式匹配的文件。

来自(2)的awk命令将创建类似的输出,但使用的是echo而不是cat

票数 0
EN

Unix & Linux用户

发布于 2022-01-19 18:36:58

只要$base$fa_pattern中没有特殊的shell字符,它就可以工作:

代码语言:javascript
运行
复制
base=/mnt/datagenetique/ANALYSIS/Infectiologie/COVID-WGS/Analyse/
fa_pattern=_*_ds*/consensus/*.consensus_hard_masked_sequence.fa

# Generate one file per pattern
cat input.csv |
  parallel --colsep , eval cat $base/{2}_*/dragen-covidseq/{1}$fa_pattern '>' {1}.fa

# Put everything in a single file
cat input.csv |
  parallel --colsep , eval cat $base/{2}_*/dragen-covidseq/{1}$fa_pattern > all.fa

# This may be faster
cat input.csv |
  parallel --colsep , -uj1 eval cat $base/{2}_*/dragen-covidseq/{1}$fa_pattern > all2.fa
票数 0
EN

Unix & Linux用户

发布于 2022-01-19 23:07:16

当然,让shell自己来解释输入数据,但这正是您所需要的帮助:

代码语言:javascript
运行
复制
$ echo first > foolbar
$ echo second > foo\*bar

$ cat $(awk 'BEGIN{print "foo*bar"}')
second
first

以上假设cat的参数列表不会超过shell的最大args长度,请参见https://stackoverflow.com/a/4185165/1745001。另一种选择是:

代码语言:javascript
运行
复制
$ while IFS= read -r file; do cat $file; done < <(awk 'BEGIN{print "foo*bar"}')
second
first
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/687031

复制
相关文章

相似问题

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