GNUパラレル:イベントが見つかりません(!〜)

GNUパラレル:イベントが見つかりません(!〜)

私のコード情報:

  1. すべての.txtファイルをインポートする
  2. 各ファイルに対して awk コマンドを実行します。すべてのファイルは並列に処理されます。
  3. 列3に「針」が含まれていない場合は、その行をファイルに書き込みます。

結果:

-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シェルに特別な意味を持ち、awk用に意図されている場合は保護する必要があります。以下を試してみてください(あなたの説明に合わせてawkスクリプトも変更しました)。

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

この拡張は、トークンが二重引用符内にあるために発生します(二重引用符内の一重引用符内にありますが、シェルは外部引用符にのみ興味があります)。

私も参考にしてください出力解析の防止ls

答え2

引用が難しい場合は、bash機能を試してください。

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

parallel myfunc {} ::: *.txt

関連情報