특정 행의 중복 항목을 제거하고 각 행의 첫 번째 항목만 유지하고 지정되지 않은 다른 중복 항목은 그대로 유지합니다.

특정 행의 중복 항목을 제거하고 각 행의 첫 번째 항목만 유지하고 지정되지 않은 다른 중복 항목은 그대로 유지합니다.

여러 개의 중복 항목이 포함된 텍스트 파일을 편집하려고 합니다. 목표는 문자열의 첫 번째 항목만 유지하고 동일한 문자열의 나머지 중복 행을 제거하는 것입니다.

샘플 파일에서

* Title 1
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 1
** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 2
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 2
** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

* Title N하나씩 소장하고 싶은데관련이 없거나 지정되지 않은 다른 모든 중복 행을 유지합니다.파일에. 결과는 다음과 같습니다.

* Title 1
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 2
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

중복을 제거하는 기존 솔루션은 다음과 같습니다.

uniq file.txt

사용 편의성을 위한 유용한 AWK 원라이너:

awk '!a[$0]++' contents.txt

shell - Unix에서 파일을 정렬하지 않고 파일에서 중복 줄을 제거하는 방법

perl -ne 'print if ! $x{$_}++' file

모든 중복 항목을 무차별적으로 제거합니다.

나는 이러한 솔루션의 변형과 GNU의 sed루프 형식을 사용해 보았습니다.

duplicateLines=$(grep -E "^\* .*" file.org | uniq)
  printf '%s\n' "$duplicateLines" | while read -r line; do
  sed "s/$line//g2" file.org
done

성공하지 못했습니다. 나는 순전한 성능에는 신경 쓰지 않으므로 여러 번 반복하는 것(예: sed 지정된 문자열을 한 번에 하나씩 삭제하기 위해 루프 내에서 호출)은 문제가 되지 않습니다.

어떤 통찰력이라도 대단히 감사하겠습니다.

쉘 스크립트에서 이 작업을 수행할 수 있으면 좋겠지만 Python, C, Java 등과 같은 다른 솔루션에도 열려 있습니다. 함수/라이브러리 이름이 무엇인지 알려주시면 거기서 검색하겠습니다. .

감사해요.

답변1

!a[$0]++증분 모드가 다음에 따라 달라지도록 awk 패러다임을 간단히 수정할 수 있습니다 .

awk '!a[$0]; /^\* Title/{a[$0]++}' file

답변2

seen[]awk에서는 문자열의 첫 번째 발생과 후속 발생을 구별하기 위해 명명된 배열을 사용하는 데 익숙합니다 . 예를 들면 다음과 같습니다.

awk '!seen[$0]++'

각 줄의 첫 번째 항목만 출력됩니다.

* Title귀하의 경우 현재 줄이 다음으로 시작하는 경우 에만 사용하고 싶습니다 .

$ awk '!( /^\* Title/ && seen[$0]++ )' file
* Title 1
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

* Title 2
** Subtitle 01
#+begin_src
  Line 001
  Line 002
#+end_src

** Subtitle 02
#+begin_src
  Line 001
  Line 002
#+end_src

관련 정보