关于我的代码:
- 获取所有 .txt 文件
- 对于每个文件,执行 awk 命令。所有文件都是并行处理的
- 如果第 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