내 코드 정보:
- 모든 .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