중복을 제거하되 첫 번째 인스턴스는 유지

중복을 제거하되 첫 번째 인스턴스는 유지

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

관련 정보