스크립트 내에서 출력 파일을 생성한 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 문이 끝난
;
지 한참이 지나서야 그것이 선택 사항이라는 것을 알지 못했습니다 .