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