여러 개의 중복 항목이 포함된 텍스트 파일을 편집하려고 합니다. 목표는 문자열의 첫 번째 항목만 유지하고 동일한 문자열의 나머지 중복 행을 제거하는 것입니다.
샘플 파일에서
* 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 '!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