0

尝试使用 paste 命令对压缩文件使用进程替换时出现错误。

我正在尝试打开 100 个压缩文件并粘贴它们的第二列。

当我尝试:

for name in $(ls FILEPATH/*.gz); do 
temp=${temp}" <(zcat "${name}" | cut -f2)"; done

paste ${temp} > DESTINATION/OUTPUTNAME'

我得到错误

 paste: invalid option -- f

当我尝试 paste$(echo ${temp})而不是 时paste ${temp},我遇到了同样的问题,但是当我echo ${temp}进入我的终端并手动将响应复制并粘贴到粘贴中时,它可以工作。

请帮我解决这个问题。

4

2 回答 2

0

问题是您不能嵌入 shell 语法,例如“<(...)”和“|” 在字符串中,因为命令行的这些部分在参数扩展发生之前被识别。您输入的所有内容都temp被视为paste.

没有简单的方法可以完成您正在尝试的事情。我不愿提及它,但我认为您需要使用eval

# Simpler than writing a loop
printf -v temp "<( zcat %s | cut -f2) " FILEPATH/*.gz

eval "paste $temp > DESTINATION/OUTPUTNAME"
于 2013-01-19T00:07:04.207 回答
0

好的,我怀疑正在发生的是:

temp 变量扩展为从 gzip 文件中检索到的文件名列表。

如果存在字符串 '--' 告诉 paste 它应该停止解析命令行以获取选项,并且 -- 之后的所有内容都是要使用的文件。

如果其中一个文件名以 -f 开头,那么您将收到错误消息。

尝试

paste -- ${temp} > DESTINATION/OUTPUTNAME

编辑:

好的,从下面的评论看来,您的 bash 版本支持重定向。

原始错误是由 cat 的 -f2 标志引起的。

尝试回声 <(ls)

如果你得到像 /dev/fd/ 这样的结果,那么进程替换工作,我对正在发生的事情感到困惑,但我怀疑你不会明白这一点。

于 2013-01-18T16:38:56.177 回答