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