파일에서 중복 단어 제거

파일에서 중복 단어 제거

다음과 비슷한 형식의 텍스트 파일이 있습니다.

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

특징

  • 반복되는 경로의 들여쓰기는 자동으로 경로의 길이와 동일해집니다.
  • 표시된 모든 경로를 저장하지 않음(대용량에서는 문제가 될 수 있음)
  • 정렬되지 않은 입력 허용(^^의 부작용)

관련 정보