【问题标题】:How to specify more inputs as a single input in Linux command-line?如何在 Linux 命令行中将更多输入指定为单个输入?
【发布时间】:2018-04-23 13:56:03
【问题描述】:

我在网上搜索,但没有找到任何可以回答我的问题的东西。

我在 Ubuntu Linux 中使用一个 java 工具,用 bash 命令调用它;这个工具有两个不同输入文件的路径:

java -Xmx8G -jar picard.jar FastqToSam \
FASTQ=6484_snippet_1.fastq \ #first read file of pair
FASTQ2=6484_snippet_2.fastq \ #second read file of pair
[...]

例如,我想做的是,而不是指定单个FASTQ 的路径,而是指定两个不同文件的路径。

因此,与其使用cat file1 file2 > File 并使用File 作为FASTQ 的输入,我希望此操作将即时执行并动态创建File,而不将其保存在文件系统(使用命令cat file1 file2 > File 会发生这种情况)。

我希望我已经清楚地解释了我的问题,以防万一问我,我会尽力解释得更好。

【问题讨论】:

  • 所以你基本上想将参数作为这两个 .fastq 文件的内容传递?
  • 我什么都不懂……
  • 是的,为了尽可能清楚,假设我想为FASTQ 指定2 个输入文件,为FASTQ2 指定2 个输入文件。如您所见,java 工具通常在输入 2 个文件路径中,但对于这些文件路径中的每一个,我想指定 2 个文件(因此在这种情况下总共需要清除 4 个文件)。

标签: linux bash ubuntu command-line command-line-arguments


【解决方案1】:

大多数接受文件名参数的编写良好的 shell 命令通常也接受文件名参数列表。比如cat filecat file1 file2等。

如果您尝试使用的程序不支持此功能并且无法轻松修复,则可能是您的操作系统或 shell 将 /dev/stdin 作为伪文件提供。

cat file1 file2 | java -mumble -crash -burn FASTQ=/dev/stdin

一些 shell 也有进程替换,(通常)看起来调用程序就像一个包含进程替换在标准输出上产生的任何内容的单个文件。

java -mumble -crash -burn FASTQ=<(cat file1 file2) FASTQ2=<(cat file3 file4)

如果这些都不起作用,使用临时文件并在完成后删除它们的简单 shell 脚本是一个经过验证的真正解决方案。

#!/bin/sh
: ${4?Need four file name arguments, will process them pairwise}
t=$(mktemp -d -t fastqtwoness.XXXXXXX) || exit
trap 'rm -rf $t' EXIT HUP INT TERM  # remove in case of failure or when done
cat "$1" "$2" >$t/1.fastq
cat "$3" "$4" >$t/2.fastq
exec java -mumble -crash -burn FASTQ=$t/1.fastq FASTQ2=$t/2.fastq

【讨论】:

  • catuseless,当您在 single 文件上使用它时。它的真正目的是一个接一个地连接多个文件。单个文件的例子确实没什么用,但是展示了一个通用的设计模式......但是感谢有机会宣讲它(-:
  • 我试过这个command,但我收到了这个exception。可能您建议的命令会起作用,问题出在这个特定的.jar 中。但是我可以说,当我使用从cat file1 file2 &gt; File 生成的File 时,该命令运行没有问题java 工具接受 .gz 文件; here 说可以 cat 2 个 .gz 文件(或者它是不同的情况?) P.P.S.抱歉删除,但我仍在处理此评论
  • 确实,您链接到的问题表明它应该可以工作。在发布我的(现已删除的)评论之前,我在本地尝试了这一点,但我想我的实验在某种程度上是错误的,因为我现在无法自己复制它。但是,gzip 对打开至少在命令行版本中没有.gz 后缀的“文件”感到紧张。在命令行上,gzip -d &lt;stdingzip -dc /dev/fd/63 有效,但我不知道如何告诉你的 Java 程序。
  • 我什至尝试使用this(包括Strack Trace),但正如您现在看到的那样,由于使用了解压缩文件,异常更具可读性。我认为问题在于 java 工具在输入中接受文件路径,而使用 cat 它接收的是“”“流”“”。我认为目前最好的解决方案是您建议的脚本,但我会等待其他解决方案,以防其他人有好主意;)
  • 在我看来,您的文件格式不符合预期。我对 FASTA/FASTQ 不够熟悉,无法立即说出错误消息的真正含义,但很明显您的输入违反了第 1 行的要求en.wikipedia.org/wiki/FASTQ_format#Format
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 2011-03-15
  • 2020-12-03
  • 2017-09-22
  • 2019-03-08
  • 1970-01-01
  • 2015-04-20
  • 2020-10-06
相关资源
最近更新 更多