두 개의 파일이 있습니다.
A.txt - 약 90GB
B.txt - 약 80GB
두 파일을 병합하고 중복된 줄을 제거하고 싶습니다.
어떻게 해야 하나요?
이 명령 외에 다른 명령이 awk
해당 작업에 더 적합하다면 알려주시기 바랍니다.
답변1
awk
해싱은 모든 고유 행을 메모리에 저장한다는 의미이므로 사용할 수 없습니다 . 따라서 출력 파일이 시스템에서 사용 가능한 메모리보다 훨씬 작은 경우에만 사용할 수 있습니다.
입력 파일이 이미 정렬된 경우 다음을 수행할 수 있습니다.
sort -mu A.txt B.txt > C.txt
파일을 정렬하는 데 사용된 것과 동일한 정렬 순서로 로케일을 변경해야 할 수도 있습니다.
이렇게 하면 파일당 한 번에 두 개 이상의 라인을 메모리에 저장할 필요가 없습니다.
정렬되지 않으면 디렉터리를 삭제하고 170GB의 여유 공간이 있는 파일 시스템(가급적 빠른 공간)으로 -m
설정하고 $TMPDIR
기다릴 준비를 하십시오.
그러나 결과가 정렬되므로 나중에 필요한 경우 다른 파일을 병합하는 속도가 빨라집니다.
sort
메모리가 적은 시스템에서도 작동하도록 임시 파일이 사용됩니다. 하지만 메모리가 많을수록 좋습니다. GNU의 경우 더 나은 성능을 위해 조정하는 데 도움이 되는 및 옵션 sort
도 참조하세요 . 사용된 정렬 순서가 중요하지 않은 경우 로캘을 (with )로 수정하는 것이 가장 효율적입니다.--compress-program
--buffer-size
C
LC_ALL=C sort...
답변2
printf "">파일 병합 catA.txt B.txt | IFS=는 -r 행을 읽는 동안; 만약에[ ! -z "$line"]; 만약에! grep -Fxqe "$line" MergFile; echo "$line">>파일 병합; 필리핀 제도 필리핀 제도 완벽한
설명하다
#을 사용하여 새 MergeFile을 생성하거나
printf "">MergeFile
선택적으로 다음을 수행합니다.touch MergeFile
두 파일을 while 루프로 파이프합니다.
cat A.txt B.txt |
각 줄을 읽으십시오:
while IFS= read -r line; do
빈 줄 처리:
if [ ! -z "$line" ]; then
*첫 번째 빈 줄을 유지하려면 else 절에 다시 추가하세요.
빈 결과는 MergeFile이 처음 입력되었음을 의미합니다(즉, 유일한 항목임).
if ! grep -Fxqe "$line" MergFile; then
병합 파일에 다음을 추가합니다.
echo "$line">>MergeFile;
답변3
다음 명령을 시도해 보세요.
cat A.txt B.txt | awk '!seen[$0]++' > C.txt
이렇게 무거운 파일을 사용하면 시간이 좀 걸릴 수도 있습니다.