
次のように、内部キャリッジリターンで区切られた行を含むファイルがあります。
電磁パルス|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
(最初の反復に挿入された改行文字を含む)。
警告:入力行の\r
2行目の前にあると混乱を招く可能性があります。|