두 개의 열이 포함된 파일을 반복합니다.

두 개의 열이 포함된 파일을 반복합니다.

내 질문은 기본적으로 후속 질문입니다.이 주제. 다음과 같은 파일이 있습니다.

1000 | line1
100  | line2
10   | line3

1달러가 20보다 크면 2달러로 뭔가를 하고 싶습니다. 흉내내려고 글을 썼어요두 번째 답변하지만 작동하지 않습니다.

for a, b in $(cat file.text|cut -d"|" -f 1,2);
do
if ($1>20) echo $2
done;

이 목표를 어떻게 달성할 수 있나요? 감사해요!

답변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 4as 옵션과 같은 것을 사용하면 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

관련 정보