CRで区切られた文字列を複数行に分割し、各行にIDを追加する方法は?

CRで区切られた文字列を複数行に分割し、各行にIDを追加する方法は?

次のように、内部キャリッジリターンで区切られた行を含むファイルがあります。

電磁パルス|123|10\アル字型情報|ジョン|スミス|M|1980/01/12\アル字型住所オハイオ州ブリッジロード|
電磁パルス|456|10\アル字型情報|デビッド|パット|M|1980/02/12\アル字型住所オハイオ州ブリッジロード|
電磁パルス|789|10\アル字型情報|ジェーン|マッケンジー|F|1980/03/12\アル字型住所オハイオ州ブリッジロード|

CR 間の行部分は|文字でさらに区切られます。

CR文字で各行を別々の行に分割したいです。それからそれぞれ新しい行(つまり、CRを改行文字で置き換えた行)は、|元の行(2番目の区切りフィールド)のIDで始まる必要があります。

予想出力:

EMP|123|10
123|INFO|JOHN|SMITH|M|01/12/1980
123|ADDR|125|BRIDGE RD|COLUMBUS|OH
EMP|456|10
456|INFO|DAVID|PIRT|M|02/12/1980
456|ADDR|257|BRIDGE RD|COLUMBUS|OH
EMP|789|10
789|INFO|JENN|MCKENZI|F|03/12/1980
789|ADDR|389|BRIDGE RD|COLUMBUS|OH

IDが繰り返されるので、出力の3行で構成される各セットが同じ(1)入力行に属することがわかります。

次のコマンドを試しましたが、CRを新しい行に置き換えました。新しい行にIDを追加する方法がわかりません。

tr '\r' '\n' < test.txt > new.txt

出力:

EMP|123|10
INFO|JOHN|SMITH|M|01/12/1980
ADDR|125|BRIDGE RD|COLUMBUS|OH
EMP|456|10
INFO|DAVID|PIRT|M|02/12/1980
ADDR|257|BRIDGE RD|COLUMBUS|OH
EMP|789|10
INFO|JENN|MCKENZI|F|03/12/1980
ADDR|389|BRIDGE RD|COLUMBUS|OH

どうすればいいですか?

答え1

どうですか?

$ awk -F '\r' '{
  print $1; 
  split($1,a,"|"); 
  for(i=2;i<=NF;i++) print a[2] "|" $i;
}' file
EMP|123|10
123|INFO|JOHN|SMITH|M|01/12/1980
123|ADDR|125|BRIDGE RD|COLUMBUS|OH
EMP|456|10
456|INFO|DAVID|PIRT|M|02/12/1980
456|ADDR|257|BRIDGE RD|COLUMBUS|OH
EMP|789|10
789|INFO|JENN|MCKENZI|F|03/12/1980
789|ADDR|389|BRIDGE RD|COLUMBUS|OH

答え2

sedから:

sed ':loop; s/^\([^|]*|\)\([^|]*|\)\([^\r]*\)\r/\1\2\3\n\2/; t loop'

これは(一種の)単純な代替です。つまり、\rバッファの最初の文字まで、すべての文字(つまり、最大および含む)からなるパターンを一致させます。 3つのキャプチャグループに分けられます。

  • |すべてはバッファの最初のエントリまで(つまり含めて)進められます。これはEMP|ファイルのすべての行に適用されます。
  • |それ以降のすべて、つまりバッファの次(つまり、2番目)まで(つまり、最大および含む) 。この名前は123|、  456| または  789| ファイルにあります。
  • それ以降のすべては(しかしいいえ\rを含む)バッファの最初。

次に、上記の内容を次に置き換えます。

  • 3つのキャプチャグループ()、つまりバッファの最初のグループ\1\2\3までのすべて\r(含まれていません)
  • 改行文字と
  • 2番目のキャプチャグループ(\2)、つまりidと  |

その後、残りのバッファ(すべて後ろに\rまず、バッファの内容はそのまま残り、新しく作成された行の重複IDの後ろにあります。

まあ、上記と一致すればS交換成功(tはいテスト)に移動して成功したら、もう一度やり直してください。

初心者には明確ではないかもしれない1つの側面は、私たちが\n使用してもSubstituteコマンドを使用して新しい行を作成し、バッファ sed全体で動作し続けます(含む「改行」(つまり、改行の次の部分)ではなく内部/組み込み改行)です。さて、  sed最初の行を読んでください。

EMP|123|10\rINFO|JOHN|SMITH|M|01/12/1980\rADDR|125|BRIDGE RD|COLUMBUS|OH

緩衝地帯に入ります。このコマンドをs初めて実行した後、バッファー含む

EMP|123|10
123|INFO|JOHN|SMITH|M|01/12/1980\rADDR|125|BRIDGE RD|COLUMBUS|OH

したがって、sコマンドの次の反復は一致します。

  • \1= EMP|
  • \2=123|
  • \3= 10 123|INFO|JOHN|SMITH|M|01/12/1980 (最初の反復に挿入された改行文字を含む)。

警告:入力行の\r2行目の前にあると混乱を招く可能性があります。|

関連情報