나는 이것을 인터넷과 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를 사용하여 테스트한 결과 sort
5GiB 파일을 정렬하는 데 문제가 없었습니다. 그래서, 당신은 그것을 설치하려고 할 수 있습니다.
하지만 기억해야 할 점:
sort -u
고유한 행이 제공되지는 않지만 모든 행 중 하나가 동일하게 정렬됩니다. 특히 GNU 시스템과 일반 로케일에서는 여러 문자가 동일하게 정렬됩니다. 바이트 수준에서 고유한 행을 원하면 를 사용하십시오LC_ALL=C sort -u
.sort
전체 메모리를 모두 사용하지 않으려면 대규모 입력에 임시 파일을 사용하여 청크로 정렬하세요. 임시 디렉토리에 충분한 공간이 없으면(일반적/tmp
으로 설정하지 않는 한$TMPDIR
) 실패합니다. 충분한 여유 공간이 있는 디렉토리로 설정하십시오 ( GNU 옵션$TMPDIR
참조 ).-T
sort
답변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;