
이라는 awk 스크립트가 있습니다 text_processing.awk
. 추가 처리를 위해 이름 등의 여러 zip 파일을 이 스크립트 01JAN21.txt.gz
에 전달해야 합니다 . 02JAN21.txt.gz
출력 파일은 입력 파일에서 날짜를 가져와서 이름을 지정합니다 result_01JAN21.txt
.
이 파일은 압축되어 있습니다.
먼저 다음 명령을 사용하여 파일에서 실행을 시도했습니다.
zcat 01JAN21.txt.gz | awk -f text_processing.awk -
그러나 내 출력 파일의 이름은 지정되지 않았습니다. 이 명령은 파일을 열고 스크립트에 파이프하기만 하고 내 스크립트는 아래와 같이 입력 파일 이름에서 날짜를 추출하기 때문이라고 생각합니다.
BEGIN{
FS = ";"
input_file = ARGV[1]
sub(/\.txt\.gz/, "", input_file)
output = "result_" input_file ".txt
}
수정하는 방법에 대한 안내를 주시면 감사하겠습니다. 한 번에 여러 파일을 전달할 것이기 때문에 awk 스크립트에서 출력 파일의 이름 변경을 유지하고 싶습니다.
답변1
현재 디렉토리에 있는 이름이 일치하는 모든 파일을 처리한다고 가정해 보겠습니다 *.txt.gz
. 이름을 변수로 전달 awk
하고 압축되지 않은 데이터를 스트리밍합니다.
for name in *.txt.gz; do
gzip -c -d -- "$name" |
awk -v name="$name" -f text_processing.awk
done
awk
코드 에서는 name
변수를 사용하여 출력 파일 이름을 계산합니다.
또는 쉘 스크립트가 사용할 명시적인 출력 파일 이름을 제공하도록 합니다.
for name in *.txt.gz; do
gzip -c -d -- "$name" |
awk -v outname="result_${name%.gz}" -f text_processing.awk
done
result_${name%.gz}
문자열은 접두사가 제거되고 추가된 원본 파일의 이름이 됩니다 . 그런 다음 코드를 작성하는 데 사용됩니다..gz
result_
awk
outname
분명히 awk
코드가 단일 출력 파일에만 쓰는 경우 awk
코드를 더욱 단순화하고 표준 출력으로 인쇄할 수 있습니다. 그런 다음 셸에서 출력을 리디렉션합니다.
for name in *.txt.gz; do
gzip -c -d -- "$name" |
awk -f text_processing.awk >"result_${name%.gz}"
done
의견에서 요청한 추가 자료: awk
병렬로 명령 실행.
이를 위해 xargs
유틸리티가 비표준 옵션 -0
(Nul로 끝나는 데이터 읽기), -r
(입력이 없을 때 주어진 명령을 실행하지 않음) 및 -P
(병렬 작업 실행)을 지원한다고 가정하고 사용하겠습니다.
print '%s\0' *.txt.gz |
xargs -0r -P 4 -I {} sh -c '
gzip -c -d -- "$1" |
awk -f text_processing.awk >"result_${1%.gz}"' sh {}
그러면 4개 파일의 gzip
+파이프라인이 동시에 실행됩니다. 생성 중인 명령을 가져오고 표시하기 위해 유틸리티 에 옵션이 awk
추가되었습니다 .-t
xargs