重複を削除しますが、最初のインスタンスは維持されます

重複を削除しますが、最初のインスタンスは維持されます

csvファイルを介してこの問題を解決するのに役立ちます。 AWKまたはSed。

id1,ipadd1,number1
id1,ipadd2,number2
id1,ipadd3,number3
id2,ipadd1,number1
id2,ipadd2,number2
id2,ipadd2,number3
id3,ipadd2,number2
id3,ipadd2,number2

希望の出力:

id1,ipadd1,number1
,ipadd2,number2
,ipadd3,number3
id2,ipadd1,number1
,ipadd2,number2
,ipadd2,number3
id3,ipadd2,number2
ipadd2,number2

答え1

$ awk 'BEGIN{FS=OFS=","} seen[$1]++{$1=""} 1' file
id1,ipadd1,number1
,ipadd2,number2
,ipadd3,number3
id2,ipadd1,number1
,ipadd2,number2
,ipadd2,number3
id3,ipadd2,number2
,ipadd2,number2

答え2

POSIX sed:

sed -e '
  x;G
  /^\([^,]\{1,\}\),.*\n\1,/!{
    g;b
  }
  g;s/^[^,]\{1,\}//
' file

awk -F ',' -v OFS=, '
  prev != $1 {
    print
    prev = $1
    next
  }
  {$1=""}1
' file

出力:

id1,ipadd1,number1
,ipadd2,number2
,ipadd3,number3
id2,ipadd1,number1
,ipadd2,number2
,ipadd2,number3
id3,ipadd2,number2
,ipadd2,number2

答え3

Millerを使用して入力をヘッダーなしのCSVレコードセットに読み込み、前のレコードの最初のフィールドと同じ場合は、各レコードの最初のフィールドを消去します。

$ mlr --csv -N put 'if (FNR == 1 || $1 != @prev) { @prev = $1 } else { $1 = "" }' file
id1,ipadd1,number1
,ipadd2,number2
,ipadd3,number3
id2,ipadd1,number1
,ipadd2,number2
,ipadd2,number3
id3,ipadd2,number2
,ipadd2,number2

上記は、次の場合にのみ現在のレコードを変更します。より早いレコードの最初のフィールドは、現在のレコードの最初のフィールドと同じです。データがソートされると削除される効果があります。みんな最初のフィールドが繰り返されます。データがソートされていない場合は、ローカル効果のみが表示されます。

同じawkコードですが、「単純な」CSVデータ(挿入された区切り文字または改行のないフィールド)のみをサポートします。

$ awk -F , 'BEGIN {OFS=FS} { if (FNR == 1 || $1 != prev) prev = $1; else $1 = "" }; 1' file
id1,ipadd1,number1
,ipadd2,number2
,ipadd3,number3
id2,ipadd1,number1
,ipadd2,number2
,ipadd2,number3
id3,ipadd2,number2
,ipadd2,number2

関連情報