Unix 스크립트를 사용하여 다음 예제 텍스트 파일을 포함된 헤더 레코드를 기반으로 두 개의 개별 파일로 분할하고 싶습니다.
CSI 447907 890947967201270
776666666 B
771555555 B
774444444 B
REL 447904 890947967201270
772222222 A
771111111 B+
770000000 A
CSI 447911 891096722201270
774444444 B+
778888888 A
779999999 A
REL 171077 889928722201270
774444444 B
773333333 B+
772222222 B+
771111111 C
PHY 114926 891987278201270
123456789 A
987654321 A
777777777 B+
결과 파일:
텍스트 파일 1
CSI 447907 890947967201270
776666666 B
771555555 B
774444444 B
CSI 447911 891096722201270
774444444 B+
778888888 A
779999999 A
텍스트 파일 2
REL 447904 890947967201270
772222222 A
771111111 B+
770000000 A
REL 171077 889928722201270
774444444 B
773333333 B+
772222222 B+
771111111 C
PHY 114926 891987278201270
123456789 A
987654321 A
777777777 B+
헤더 레코드 수와 세부 레코드 수는 다를 수 있습니다. 열/필드는 정적입니다. 첫 번째 텍스트 파일에는 CSI 헤더와 해당 상세 레코드가 포함되어 있고 두 번째 텍스트 파일은 나머지입니다.
답변1
awk의 또 다른 일반적인 작업은 다음과 같습니다.
POSIXLY_CORRECT=1 LC_ALL=C awk '
$1 ~ /^[A-Z]{3}$/ {
if ($1 == "CSI")
file = "csi.txt"
else
file = "rest.txt"
}
file {print > file}'
POSIXLY_CORRECT
이는 GNU awk가 awk
표준 일치 모드를 제외하고 인식하지 못하는 경우에만 해당됩니다.{...}
LC_ALL=C
에서 까지의 [A-Z]
ASCII 문자를 나타내야 합니다 . 그렇지 않으면 지역화 설정에 따라 범위에 다른 문자가 포함될 수 있습니다.A
Z
Solaris에서는 command -p awk
또는 를 사용하십시오. 그렇지 않으면 더 이상 사용하지 않게 /usr/xpg4/bin/awk
될 수도 있습니다 ./bin/awk
답변2
while 루프를 사용하고 첫 번째 CSI 헤더를 읽었습니다. 그런 다음 제목과 세부 사항을 작성할 수 있습니다.
이것이 내가 지금까지 가지고 있는 것입니다:
file="data.txt"
STR=CSI
while IFS= read -r line
do
if [[ ${line} = @(${STR}*) ]] then
echo $line > file2.txt
while IFS= read -r line2
do
echo $line2 >> file2.txt
done
fi
done <"$file"
스티븐