awk 스크립트의 Gunzip

awk 스크립트의 Gunzip

스크립트 내에서 출력 파일을 생성한 awk다음 파일을 압축하고 싶습니다.

입력 파일 - Marks.txt

Student1:AP:Maths:30:Science:43
Student2:AP:Maths:23:Science:35
Student3:Non_AP:Maths:17:Science:33

내 코드는 다음과 같습니다

BEGIN{
   FS = ":"
}

$2 == "AP"{
 print $3, $4 > "maths_AP.txt"
}

$2 == "Non_AP"{
 print $3, $4 > "maths_non_AP.txt"
}

{...} #some other processing not relevant to question

및 압축 파일을 maths_AP.txt모두 생성 하고 싶습니다 . maths_non_AP.txt일부 포럼에서는 함수 사용을 제안 gunzip하지만 이를 스크립트에 넣는 방법을 모르겠습니다.

답변1

awk는 텍스트를 조작하는 도구입니다. 셸은 파일과 프로세스를 조작(생성/파기)하고 다른 도구에 대한 호출 순서를 지정하기 위한 도구입니다. 따라서 일반적으로 awk 내에서 다른 도구를 순차적으로 호출하면 안 됩니다. 왜냐하면 이것이 쉘의 작업이기 때문입니다. 대신 awk를 사용하여 텍스트를 조작한 다음 쉘이 테스트되지 않은 도구와 같은 다른 도구를 호출하도록 하십시오.

mkdir out &&
sort -t':' -k3,3 -k2,2 Marks.txt |
awk '
    BEGIN { FS=OFS=":" }
    { key = "out/" $3 "_" $2 ".txt" }
    key != out {
        close(out)
        out = key
    }
    { print > out }
' &&
for file in out/*.txt; do
    zip "$file" &&
    rm -f "$file"         # assuming you want to discard the .txt file
done

위 내용은 모든 버전의 도구에 적용됩니다. close()awk를 호출하지 않는 솔루션은 동시에 열려 있는 파일의 최대 개수 임계값을 초과하면 대부분의 awk 버전에서 실패합니다(20개 미만으로 발견했습니다).

답변2

awk 실행 후 또는 도중에 압축을 수행할 수 있습니다.

노력하다

$2 == "AP"{
 print $3, $4 > "maths_AP.txt" ;
 print $3, $4 | "gzip > maths_AP.gz" ;
}

$2 == "Non_AP"{
 print $3, $4 > "maths_non_AP.txt" ;
 print $3, $4 | "gzip > maths_non_AP.gz" ;
}
  • 쓸 파일이 너무 많으면 파일 설명자가 부족해질 수 있습니다.
  • 나는 awk 문이 끝난 ;지 한참이 지나서야 그것이 선택 사항이라는 것을 알지 못했습니다 .

관련 정보