GNU Parallel:未找到事件 (!~)

GNU Parallel:未找到事件 (!~)

关于我的代码:

  1. 获取所有 .txt 文件
  2. 对于每个文件,执行 awk 命令。所有文件都是并行处理的
  3. 如果第 3 列不包含“needle”,则将行写入文件

结果:

-bash:!~: 未找到事件

代码:

ls *.txt | parallel "awk -F '\t' -v OFS='\t' '$1 { if($3 !~ /needle/){print;} ;}' {} > {}.output"

问题:

  • 我究竟做错了什么?

谢谢

答案1

这看起来像是一个引用问题。也许调试这个问题的最简单方法是将选项传递--dry-run给并行:

$ parallel --dry-run "awk -F '\t' -v OFS='\t' '$1 { if($3 !~ /needle/){print;} ;}' {} > {}.output" ::: in
awk -F '\t' -v OFS='\t' ' { if( ~ /needle/){print;} ;}' in > in.output

在那里你可以看到你的变量$1$3已经消失,并且!~已经扩展到~(在我的例子中)。所有这些对于 bash shell 都有特殊含义,如果它们是用于 awk 的,则应该受到保护。请尝试以下操作(我还更改了 awk 脚本以适合您的描述):

parallel awk -F '\\t' -vOFS='\t' $'\'($3 !~ /needle/) { print }\'' \>{}.output {} ::: *.txt

发生这些扩展的原因是标记位于双引号内(它们位于双引号内的单引号内,但 shell 只关心外部引号)。

请注意,我也避免解析输出ls

答案2

当引用变得太困难时,请考虑使用 bash 函数:

myfunc() {
  awk -F '\t' -v OFS='\t' '$1 { if($3 !~ /needle/){print;} ;}' "$1" > "$1".output
}
export -f myfunc

parallel myfunc {} ::: *.txt

相关内容