ヘッダーレコードを含むファイルを2つのファイルに分割する

ヘッダーレコードを含むファイルを2つのファイルに分割する

Unixスクリプトを使用して、次のサンプルテキストファイルを含むヘッダーレコードに基づいて2つの別々のファイルに分割したいと思います。

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ヘッダーと対応する詳細レコードが含まれ、2番目のテキストファイルは残りです。

ベストアンサー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

おすすめ記事