awk 결과를 다른 명령의 인수로 사용

awk 결과를 다른 명령의 인수로 사용

저는 awk를 사용하여 텍스트 파일 세트에서 줄을 추출하고 있습니다. 파일은 다음과 같습니다.

1000    1    75
1000    2    76
1001    1    76
1001    2    80

다음 명령을 사용하여 이러한 디렉터리 중 여러 개를 검색하고 있습니다.

awk -F"\t" '$3 == "76" { print $1"\t"$2}' ../benchmark/*/labels.txt

awk는 나에게 올바른 출력을 제공합니다.

1000    2
1001    1

이제 발견된 각 행에 대해 다음과 같이 이 두 숫자를 매개변수로 전달하는 스크립트를 실행해야 합니다.

./build.oct 1000    2

이를 수행하는 올바른 방법은 무엇입니까? 나는 스크립트 콘솔 출력(파일 생성)에 별로 관심이 없습니다.

답변1

xargs( 를 사용 -l하여 각 줄에 대해 별도의 명령을 실행하도록 할 수도 있습니다 ):

timp@helez:~/tmp$ awk -F"\t" '$3 == "76" { print $1"\t"$2}' test.txt | xargs -l ./build.oct 
$1 is  1000  and $2 is  2
$1 is  1001  and $2 is  1

timp@helez:~/tmp$ cat test.txt
1000    1   75
1000    2   76
1001    1   76
1001    2   80
timp@helez:~/tmp$ cat build.oct
echo '$1 is ' $1 ' and $2 is ' $2

주석에서 제안한 대로 awk및 및 가 탭과 공백 awk으로 분할되어 있으므로 명령을 단순화할 수도 있습니다.xargs

timp@helez:~/tmp$ awk '$3 == "76" {print $1,$2}' test.txt | xargs -l ./build.oct
$1 is  1000  and $2 is  2
$1 is  1001  and $2 is  1

답변2

이것은 나에게 효과적입니다.

awk -F"\t" '$3 == "76" { printf "./build.oct %d %d\n", $1, $2}' \
../benchmark/*/labels.txt | bash

답변3

생각해 보세요:

cat ../benchmark/*/labels.txt |
while IFS=$'\t' read P1 P2 P3 ; do
  [[ $P3 == 76 ]] && echo $P1 $P2
done |
sort -u |
parallel ./build.oct
  • 내장된 파서를 awk사용하여 하위 프로세스를 저장 합니다(아래 설명 참조).readline
  • 사기를 당하는 것을 피할 수 있습니다sort -u
  • parallelxargs -l1(또는)을 통해 리소스를 활용할 수 있습니다 .

기타 관심 있는 방법은 다음과 같습니다 awk.

awk -F'\t' '$3==76 && !seen[$1,$2]++ {
  print $1 FS $2 | "parallel ./build.oct"
}' ../benchmark/*/labels.txt
  • FS텍스트 대신 입력 필드 구분 기호 재사용
  • 카운터 배열을 사용하여 중복된 항목 삭제
  • 파이프를 통해 awk 하위 프로세스에 연결하는 방법을 배웁니다.

답변4

Gnu awk에는 system기능이 있습니다. 다음과 같이 뭔가를 실행할 수 있습니다

awk '$3 == "76" { system("./build.oct " $1 " " $2) }' ....

관련 정보