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
parallel
(또는xargs -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) }' ....