큰 텍스트 목록에서 중복 항목 제거

큰 텍스트 목록에서 중복 항목 제거

나는 이것을 인터넷과 stackexchange에서 검색했습니다. 비슷한 주제가 많지만 아직 해결책을 찾지 못했습니다.

따라서 약 5%의 중복 행이 있는 상당히 큰 목록(약 20GB)이 있습니다. 중복 항목 중 하나가 제거되도록 이 목록을 필터링하고 싶습니다. 예:

입력하다:

test123
Test123
test
test123
test 123

산출:

test123
Test123
test
test 123

목록이 정렬되었는지 여부는 중요하지 않습니다.

나도 sort -u -o output.txt그것을 시도했습니다 sort -us -o output.txt. 작은 파일에는 잘 작동하지만 약보다 큰 파일을 처리하려고 하면 4GB인 경우 결과 파일은 의심스러울 정도로 작으며 .txt 파일 대신 "emacs-lisp-source-text"가 됩니다.

누구든지 나를 도울 수 있다면 매우 감사하겠습니다!

답변1

GNU coreutils 8.26에서 GNU를 사용하여 테스트한 결과 sort5GiB 파일을 정렬하는 데 문제가 없었습니다. 그래서, 당신은 그것을 설치하려고 할 수 있습니다.

하지만 기억해야 할 점:

  • sort -u고유한 행이 제공되지는 않지만 모든 행 중 하나가 동일하게 정렬됩니다. 특히 GNU 시스템과 일반 로케일에서는 여러 문자가 동일하게 정렬됩니다. 바이트 수준에서 고유한 행을 원하면 를 사용하십시오 LC_ALL=C sort -u.
  • sort전체 메모리를 모두 사용하지 않으려면 대규모 입력에 임시 파일을 사용하여 청크로 정렬하세요. 임시 디렉토리에 충분한 공간이 없으면(일반적 /tmp으로 설정하지 않는 한 $TMPDIR) 실패합니다. 충분한 여유 공간이 있는 디렉토리로 설정하십시오 ( GNU 옵션 $TMPDIR참조 ).-Tsort

답변2

printf "">출력 파일
고양이 입력 파일 |
IFS=는 -r 행을 읽는 동안;
  만약에[ ! -z "$line"];
    만약에! grep -Fxqe "$line" 출력 파일;
      echo "$line">>출력 파일;
    필리핀 제도
  필리핀 제도
완벽한

설명하다

새 출력 파일 만들기
printf "">OutputFile

입력 파일을 while 루프에 파이프합니다.
cat InputFile |

각 줄을 읽으십시오
while IFS= read -r line; do

빈 줄 처리
if [ ! -z "$line" ]; then

행이 이미 OutputFile에 있는지 확인하십시오.
결과가 비어 있으면 OutputFile에 아직 없는 것입니다(즉, 고유한 것입니다).
if ! grep -Fxqe "$line" OutputFile; then

출력 파일에 줄 넣기
echo "$line">>OutputFile;

관련 정보