awk 두 개의 큰 파일을 병합하고 중복 줄을 제거합니다.

awk 두 개의 큰 파일을 병합하고 중복 줄을 제거합니다.

두 개의 파일이 있습니다.

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-sizeCLC_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

이렇게 무거운 파일을 사용하면 시간이 좀 걸릴 수도 있습니다.

관련 정보