将并行变量“{}”作为awk变量

时间:2016-02-28 23:28:46

标签: bash awk gnu-parallel

我想按照相同的顺序提取ids.ped中的所有行,根据保留相同顺序的单词列表(list_of_words的第二列)。

ids.ped文件

2425 NA19901 0
2472 NA20291 0
2476 NA20298 0
1328 NA06989 0
...

我想将awkparallel用于此任务。

我尝试了以下内容:

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的原因之一。

欢迎有效解决此问题的任何其他答案。 感谢。

2 个答案:

答案 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的示例,但这是一个说明parallelawk一起使用的脚本:

$ 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进行了测试。]