awk 스크립트에서 여러 압축 파일 읽기

awk 스크립트에서 여러 압축 파일 읽기

이라는 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}문자열은 접두사가 제거되고 추가된 원본 파일의 이름이 됩니다 . 그런 다음 코드를 작성하는 데 사용됩니다..gzresult_awkoutname

분명히 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추가되었습니다 .-txargs

관련 정보