![파일에서 중복 단어 제거](https://linux55.com/image/210928/%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%A4%91%EB%B3%B5%20%EB%8B%A8%EC%96%B4%20%EC%A0%9C%EA%B1%B0.png)
다음과 비슷한 형식의 텍스트 파일이 있습니다.
path1/path2/path3a 34474538656
path1/path2/path3a 8115147679
path1/path2/path3b 2266371027
path1/path2/path3b 3860823
path1/path2/path3b 554247
그리고 패턴은 계속됩니다. 열 1의 중복 항목만 제거하고 다음과 같이 인쇄하고 싶습니다.
path1/path2/path3a 34474538656
8115147679
path1/path2/path3b 2266371027
3860823
554247
가능합니까?
열은 단일 공백으로 구분됩니다.
모든 경로의 길이는 동일합니다.
읽기 쉽도록 전역적으로 정렬하는 것이 좋습니다.
답변1
한 가지 방법은 다음과 같습니다.
$ awk '{ print seen[$1]++ ? " "$2 : $0}' file
path1/path2/path3a 34474538656
8115147679
path1/path2/path3b 2266371027
3860823
554247
다음과 같이 작성할 수도 있습니다.
$ awk -v spacer=' ' '{ print seen[$1]++ ? spacer$2 : $0}' file
path1/path2/path3a 34474538656
8115147679
path1/path2/path3b 2266371027
3860823
554247
또는
$ awk -v spacer=' ' '{ if(seen[$1]++){print spacer$2}else{print}}' file
path1/path2/path3a 34474538656
8115147679
path1/path2/path3b 2266371027
3860823
554247
또는 perl
심의 길이를 동적으로 계산합니다.
$ perl -lane '$spacer=$seen{$F[0]}++ ? " " x length($F[0]) : $F[0]; print "$spacer $F[1]"' file
path1/path2/path3a 34474538656
8115147679
path1/path2/path3b 2266371027
3860823
554247
답변2
또 다른 구현
awk '
$1 == prev {gsub(/./, " ", $1); changed = 1}
!changed {prev = $1}
{print; changed = 0}
' file
답변3
파티에 늦었지만 내 해결책은 다음과 같습니다.
awk '{this = $1 ; if (this == last) {gsub(/./, " ", $1)} ; last = this ; print $0}' input
특징
- 반복되는 경로의 들여쓰기는 자동으로 경로의 길이와 동일해집니다.
- 표시된 모든 경로를 저장하지 않음(대용량에서는 문제가 될 수 있음)
- 정렬되지 않은 입력 허용(^^의 부작용)