0

入力:

    Process1 |5f|03/29/13 15:32:59
    Process1 |6f|03/29/13 17:59:03
    Pro cess1 |s7|03/29/13 17:59:05
    Pro cess1 |1234|03/29/13 20:33:43
    Pro cess1 |L|03/29/13 20:33:54
    A Pro cess |45g|03/29/13 20:34:59
    A Pro cess |f4|03/29/13 21:10:22
    B Pro cess |Es|03/30/13 00:11:25
    B Pro cess |23|03/30/13 00:47:20
    B Pro cess |E23|03/30/13 01:03:07

期待される出力:

Process1 |5f|03/29/13 15:32:59
 |6f|03/29/13 17:59:03
Pro cess1|s7|03/29/13 17:59:05
 |1234|03/29/13 20:33:43
 |L|03/29/13 20:33:54
A Pro cess |45g|03/29/13 20:34:59
 |f4|03/29/13 21:10:22
B Pro cess |Es|03/30/13 00:11:25
 |23|03/30/13 00:47:20
 |E23|03/30/13 01:03:07

ロジック : 1 列目のインスタンスを 1 つだけ残し、他のインスタンスを空白に置き換えます

私はこれを試しましたが、うまくいきませんでした(以下のコードをループに入れます):

sed -e 's/Process1/ /g' -e 's/ /Process1/1' Input

(Process1 を「-」に置き換えてから、「-」の最初のインスタンスを再度 Process1 に置き換えます。

「cnicutar」で与えられたように、awkを次のように変更しました:

awk -F "|" '{a[$1]++; if (a[$1] > 1) $1=""; print;}' ファイル

abv からの出力:

Process1 |5f|03/29/13 15:32:59
 6f 03/29/13 17:59:03
Pro cess1 |s7|03/29/13 17:59:05
 1234 03/29/13 20:33:43
 L 03/29/13 20:33:54
A Process |45g|03/29/13 20:34:59
 f4 03/29/13 21:10:22
B Pro cess |Es|03/30/13 00:11:25
 23 03/30/13 00:47:20
 E23 03/30/13 01:03:07

目的の出力 (挿入 |)

Process1 |5f|03/29/13 15:32:59
     |6f|03/29/13 17:59:03
Pro cess1 |s7|03/29/13 17:59:05
     |1234|03/29/13 20:33:43
     |L|03/29/13 20:33:54
A Process |45g|03/29/13 20:34:59
     |f4|03/29/13 21:10:22
B Pro cess |Es|03/30/13 00:11:25
     |23 | 03/30/13 00:47:20
     |E23| 03/30/13 01:03:07
4

1 に答える 1

2

少し横方向の解決策はどうですか:

[cnicutar@ariel ~]$ awk '{a[$1]++; if (a[$1] > 1) $1=""; print;}' file
Process1 |5f|03/29/13 15:32:59
 |6f|03/29/13 17:59:03
 |s7|03/29/13 17:59:05
 |1234|03/29/13 20:33:43
 |L|03/29/13 20:33:54
AProcess |45g|03/29/13 20:34:59
 |f4|03/29/13 21:10:22
BProcess |Es|03/30/13 00:11:25
 |23|03/30/13 00:47:20
 |E23|03/30/13 01:03:07

編集に照らして、次のことが必要になる場合があります。

awk -F'|' '{OFS="|"; a[$1]++; if (a[$1] > 1) $1=" "; print;}' file
于 2013-04-12T06:30:25.523 に答える