헤더 레코드가 포함된 파일을 두 개의 파일로 분할

헤더 레코드가 포함된 파일을 두 개의 파일로 분할

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 문자를 나타내야 합니다 . 그렇지 않으면 지역화 설정에 따라 범위에 다른 문자가 포함될 수 있습니다.AZ

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"

스티븐

관련 정보