私のコード情報:
- すべての.txtファイルをインポートする
- 各ファイルに対して awk コマンドを実行します。すべてのファイルは並列に処理されます。
- 列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