답변1
그리고 awk
:
$ for param in $(awk '$1 > 20 { print $3 }' inputfile); do ./process.sh "$param"; done
답변2
실제로는 셸 자체에서 데이터를 구문 분석하는 것이 아니라 비슷한 도구를 사용하여 awk
데이터를 구문 분석할 수 있습니다.
awk -F '[[:blank:]|]+' '$1 > 20 { print $2 }' file
이는 awk
파일의 각 행을 파이프 문자 또는 공백(공백 또는 탭) 수에 따라 구분된 필드 집합으로 처리하도록 지시합니다. 첫 번째 필드가 20보다 크면 두 번째 필드를 인쇄합니다.
관련된:
[[:blank:]]*[|][[:blank:]]*
두 번째 열에 공백이 포함되어 있으면 구분 기호로 사용해야 할 수 있습니다 .
awk -F '[[:blank:]]*[|][[:blank:]]*' '$1 > 20 { print $2 }' file
[|]
리터럴 파이프 기호와 일치하며 \\|
(백슬래시를 선호하는 경우)로 대체될 수 있습니다.
다음 명령은 두 번째 열에서 20보다 큰 첫 번째 열의 모든 인스턴스를 명령줄 인수로 사용하여 스크립트를 실행합니다.
awk -F '[[:blank:]]*[|][[:blank:]]*' '$1 > 20 { print $2 }' file |
xargs -I XX ./script.sh XX
-P 4
as 옵션과 같은 것을 사용하면 xargs
스크립트의 여러 병렬 인스턴스를 동시에 실행할 수 있습니다(.NET을 사용하는 경우 4개) -P 4
.
답변3
awk -F'|' '$1 > 20 { system("/path/to/another/script.sh "$2 }' < file.text
이는 awk에게 파이프 기호를 기반으로 입력을 필드로 분할하도록 지시합니다. 20보다 큰 값을 가진 첫 번째 필드는 원하는 대로 시스템 호출을 트리거합니다. 인수(여기서는 $2이지만 $0 또는 awk에서 수행하는 다른 계산일 수도 있음)는 셸 호출을 통해 스크립트에 전달되므로 이러한 값에 셸 특수 문자가 포함될 수 있는 경우 따옴표로 묶을 때 주의하세요. 참고하겠습니다스테판의 답변 중 하나이를 수행하는 방법에 대한 예:
awk 'function escape(s) {
gsub(/'\''/,"&\\\\&&",s)
return "'\''" s "'\''"
}
{ system("/path/to/another/script.sh" escape($2)) }'
답변4
Gnu sed를 사용해 볼 수도 있습니다.
sed -E 's/([0-9]*) \| (.*)/[ \1 -gt 20 ] \&\& echo do something with \2/e' infile