Unixで固定長ファイル間の改行を削除する

Unixで固定長ファイル間の改行を削除する

ホストから固定長ファイルの特定の属性を取得してガベージ文字を取得したため、このガベージ文字が改行文字として読み取られ、結果としてデータ全体が破損しています。

ファイルのデータ例

0401000000030020170628000000710000366400201706280002750035*T000100N▒101892928550383900000009201 00000000000008402017062800000020  0000006435000000000000000840A1E098D09D9279BE4000561510A00003220000000000000000000000FF

0401000000030020170628000000710000365400201706280001041125
T000100N▒101909856755446700000018201 00000000000008402017062800000000  00000067540000000000000008402ED730917E9D1DC040000B0810A04003240000000000000000000000FF

ガベージ文字を受け取りましたが、最初のレコードは正しいです*T000100N▒が、2番目のレコードの場合、T000100N▒ガベージ文字は新しい行文字として読み取られます。

答え1

あなたの例でsed成功:

sed '/^.\{216\}$/!N;s/./?/59' file

このアドレスは、/^.\{216\}$/!必須の216文字の長さではない行で次のコマンドを実行します。この場合、行が分割され、N残りの行を読み取ると仮定します。

その後、コマンドはレコードのs59番目の文字(*または改行文字)を疑問符で置き換えます(必要に応じて変更)。

これはあなたの例ではうまくいきますが、他のランダムバイトまたはマルチバイト文字がスクリプトを破損するかどうかはわかりません。

したがって、sedすべての場合で動作しない場合は、次の素晴らしいツールを使用してください。bbeバイナリデータを含む固定長レコードの処理に最適です。

bbe -b ":219" -e 'r 58 ?' file

-b ":219"ブロックサイズを219(改行およびマルチバイト文字を含む)として定義し、r 58 ?オフセット58のバイトを疑問符で置き換えます(したがって59文字)。

関連情報