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

관련 정보