最初の3つのフィールドが同じ重複行をマージする

最初の3つのフィールドが同じ重複行をマージする

次の入力があります(1,000行)。sed同じ最初の3つのフィールドと重複行をマージするコマンドが必要です。次へ追加分野のみが異なる削除「該当なし」:

D04005;4;279;0;0;SSM-4-1
D04005;5;40;0;0;SSM-5-1
LE040A;1;363;(26.3);N/A;SM-1-1
LE040A;1;363;(27.4);N/A;SM-1-2

予想出力:

D04005;4;279;0;0;SSM-4-1
D04005;5;40;0;0;SSM-5-1
LE040A;1;363;(26.3);(27.4);SM-1-1/SM-1-2

答え1

sed ':n
    s|;N/A;|;|g;$!N
    s|^\(\([^;]*;\)\{3\}\)\(.*\)\n\1|\1\3;|;tn
    P;D
'   <<\IN
D04005;4;279;0;0;SSM-4-1
D04005;5;40;0;0;SSM-5-1
LE040A;1;363;(26.3);N/A;SM-1-1
LE040A;1;363;(27.4);N/A;SM-1-2
LE040A;1;363;(28.5);N/A;SM-1-3
LE040A;1;363;(29.6);N/A;SM-1-4
IN

入力の各シーケンスについては、testに分岐し続け、各シーケンスの尾だけをマージします。

これは移植可能ですが、使用できる場合は作成が簡単になります。-E拡張正規表現(BSDやGNUバージョンを使用しているかのように)...

sed -E ':n
        s|;N/A;|;|g;$!N
        s|^(([^;]*;){3})(.*)\n\1|\1\3;|;tn
P;D'

1行にすべてのコンテンツを作成するには、次の手順を実行します。

sed -Ee:n -e's|;N/A;|;|g;$!N;s|^(([^;]*;){3})(.*)\n\1|\1\3;|;tn' -eP\;D

...効果があるでしょうが、あまり気に入らなかった。一行そう…

とにかく、最初の出力は次のようになります。

出力

D04005;4;279;0;0;SSM-4-1
D04005;5;40;0;0;SSM-5-1
LE040A;1;363;(26.3);SM-1-1;(27.4);SM-1-2;(28.5);SM-1-3;(29.6);SM-1-4

次に始まる末尾のフィールドを移動することもできます。SM-行の最後まで接続してそれぞれを で区切ると、次のことが機能しなければならないと/思います。

sed -E ':n
        s|;N/A;|;|g
        s|;(SM-[^;]*)$|/\1|;$!N
        s|^(([^;]*;){3})(.*)\n\1|\1\3;|;tn
P;D'

しかし、何が必要なのかをより明確かつ具体的に説明すると、これはより簡単で迅速になります。同じ最初の3つのフィールドだけをマージしたくないようです。どの2 つの連続した行と一致するフィールドの削除N/A~からどの線を引いて移動SM-フィールドの終わりどのワイヤー。代わりに、あなたが言うこれらすべての個々の仕事は実際に同じことを意味し、あなたが本当に次のようなことをしたいようです:

  • 入力行に3つの英数字、セミコロンで区切られたフィールド、括弧で囲まれた浮動小数点フィールド、および別のコロン区切り文字が順番に含まれている場合N/Aフィールドで次のことを行う必要があります。
    1. 次の行もこの説明と一致することを確認し、その場合は現在の行と次の行の最初の3つのフィールドを比較します。
    2. 一致するものが見つかると、次の行の最後のフィールドのみが保持され、再帰的に再試行されます。
    3. それにもかかわらず、一致するフィールドは常に削除されます。N/A、最後のもの;に変更します/
  • とにかく、標準出力で残っているすべてを印刷します。

違いは見えますか?単一の初期条件に基づいて実行される一連の操作。このように明確に説明できれば、一致が処理時間の一般性を補う必要はありません。

私が正しい場合は、次のように動作します。

sed '   \|;N/A;|!b
        s||/|;$!N
        \|^\(.*(\)\(.*)\)\(.*\)\(\n\1\)\(.*)\)|!P
        s||\4\2;(\5\3|;D
' <<\IN
D04005;4;279;0;0;SSM-4-1
D04005;5;40;0;0;SSM-5-1
LE040A;1;363;(26.3);N/A;SM-1-1
LE040A;1;363;(27.4);N/A;SM-1-2
LE040A;1;363;(28.5);N/A;SM-1-3
LE040A;1;363;(29.6);N/A;SM-1-4
IN

D04005;4;279;0;0;SSM-4-1
D04005;5;40;0;0;SSM-5-1
LE040A;1;363;(26.3);(27.4);(28.5);(29.6)/SM-1-1/SM-1-2/SM-1-3/SM-1-4

...ここにいる-Eラインに...

sed -e'\|;N/A;|!b' -e's||/|;$!N;\|^\(.*(\)\(.*)\)\(.*\)\(\n\1\)\(.*)\)|!P;s||\4\2;(\5\3|;D'

...または-E拡張構文...

sed -Ee'\|;N/A;|!b' -e's||/|;$!N;\|^(.*\()(.*\))(.*)(\n\1)(.*\))|!P;s||\4\2(\5\3|;D'

答え2

送信機:

@(repeat)
@  (cases)
@id;@f2;@f3;@val1;@nil;@sm1
@id;@f2;@f3;@val2;@nil;@sm2
@    (do (put-line `@id;@f2;@f3;@val1;@val2;@sm1/@sm2`))
@  (or)
@line
@    (do (put-line line))
@  (end)
@(end)

$ txr data.txr data
D04005;4;279;0;0;SSM-4-1
D04005;5;40;0;0;SSM-5-1
LE040A;1;363;(26.3);(27.4);SM-1-1/SM-1-2

答え3

sed -r ':a;N;s!;N/A!!g;s/^(([^;]*;){3})(.*)\n\1/\1\3;/;T;s!^(([^S][^;]*;){3,})(S*SM-[^;]*);(([^S][^;]*;){1,})(.*)!\1\4\3/\6!;ta' inputfile

出力内の6フィールドのコメントの暗黙的な数学はペアのみを示していますが、これはループバージョンであり、一致すると出力SM-1-1 / SM-1-2が変更されます。

関連情報