我想按照相同的顺序提取ids.ped
中的所有行,根据保留相同顺序的单词列表(list_of_words
的第二列)。
ids.ped文件:
2425 NA19901 0
2472 NA20291 0
2476 NA20298 0
1328 NA06989 0
...
我想将awk
和parallel
用于此任务。
我尝试了以下内容:
cut -f2 list_of_words |
parallel -j35 --keep-order \
awk -v id={} 'BEGIN{FS=" "}{if($2 == id){print $2,$3}}' ids.ped
然而,我收到错误
/bin/bash: -c: line 0: syntax error near unexpected token `('
/bin/bash: -c: line 0: `awk -v id= BEGIN{FS=" "}{if($2 == id){print $2,$3}} ids.ped'
我似乎无法以这种方式通过{}
。
注意:
ids.ped
很大,这就是我要并行化的方式awk
因为我想根据第二个提取行
ids.ped
出于某种原因,我不明白为什么grep -w
两次提取一些行,这是我宁愿使用awk
的原因之一。
欢迎有效解决此问题的任何其他答案。 感谢。
答案 0 :(得分:3)
我无法重现您的参数传递问题(您是否在文件开头有空列?)但由于parallel
如何解释参数,我确实得到了语法错误。< / p>
/opt/local/bin/bash: -c: line 0: syntax error near unexpected token `('
/opt/local/bin/bash: -c: line 0: `awk -v id=NA20291 BEGIN{FS=" "}{if($2 == id){print $2,$3}} foo.txt'
你有三个选择来解决这个问题;您可以将-q
选项添加到parallel
至"protect against evaluation by the subshell":
cut -f2 list_of_words |
parallel -j35 -q --keep-order \
awk -v id="{}" 'BEGIN{FS=" "}{if($2 == id){print $2,$3}}' ids.ped
您可以将awk
代码移动到单独的文件中;命令的其余部分很简单,不需要转义:
cut -f2 list_of_words |
parallel -j35 --keep-order awk -v id={} -f foo.awk ids.ped
foo.awk
的内容:
#!/usr/bin/awk
BEGIN {
FS=" "
}
{
if($2 == id){
print $2,$3
}
}
或者,您可以弄清楚如何逃避命令。上面链接的手册说&#34;大多数人永远不需要更多的引用而不是放置&#39; \&#39;在特殊字符面前。&#34;
cut -f2 list_of_words |
parallel -j35 --keep-order \
awk -v id="{}" \''BEGIN{FS=" "}{if($2 == id){print $2,$3}}'\' ids.ped
答案 1 :(得分:1)
正如@ miken32所说,将awk脚本作为并行参数提供可能很棘手,但这是一种方法:
parallel -j1 --keep-order \
awk -v id="{}" "'"'{ if ($2 == id ) { print $2,$3 }}'"'" ids.ped
原始问题没有提供list_of_words
的示例,但这是一个说明parallel
与awk
一起使用的脚本:
$ cat check
#!/bin/bash
function DATA {
cat<<EOF
1328 NA06989
2425 NA19901
EOF
}
DATA | cut -f2 |
parallel -j2 --keep-order awk -v id="{}" "'"'{ if ($2 == id ) { print $2,$3 }}'"'" ids.ped
$ ./check
NA06989 0
NA19901 0
$ parallel --version
GNU parallel 20160122
[这已在Mac上使用/ usr / bin / awk,gawk和mawk进行了测试。]