2017-10-08 16 views
1

리눅스 머신에 거대한 일반 텍스트 파일 (~ 500Gb)이 있습니다. 헤더 행 (파일의 첫 번째 행)에서 일부 문자열을 바꾸기를 원하지만 모든 방법이 느리고 효율이 낮은 것으로 보입니다.가장 빠른 방법은 리눅스 명령 줄에서 거대한 파일의 첫 번째 행에 문자열을 교체하려면?

예시 파일 :

foo apple cat 
1 2 2 
2 3 4 
3 4 6 
... 

예상 파일 출력 :을 나오지

bar apple cat 
1 2 2 
2 3 4 
3 4 6 
... 

:

sed -i '1s/foo/bar/g' file 

-i 캔 C 파일을 제 위치에 배치하지만이 명령은 디스크에 tmp 파일을 생성하고 원래 파일을 대체하기 위해 tmp 파일을 사용합니다. io 낭비 시간.


정력 :

ex -c '1s/foo/bar/g' -c 'wq' file 

정력이 tmp 파일을 생성하지 않지만,이 도구 중 많은 시간을 낭비 메모리에 전체 파일을로드합니다.


첫 번째 행을 메모리로 읽어 와서 원래 파일에 다시 쓰는 것이 더 나은 해결책이 있습니까? 나는 리눅스가 head 명령은 첫 번째 열을 매우 빨리 추출 할 수있는 것으로 알고 있습니다.

+0

샘플 입력과 원하는 출력을 원하는 질문에 추가하십시오. – Cyrus

+2

이것은'foo'와'bar'가 같은 길이 (바이트 단위) 인 경우에만 할 수 있습니다. 그렇지 않으면 전체 파일을 다시 작성하는 것이 유일한 옵션입니다 (도구가 충분히 똑똑하면 그대로 수행 할 수 있습니다). – Thomas

+0

@cyrus 예제를 추가했습니다. –

답변

0

awk 명령을 따르십시오.이 도구가 도움이되는지 알려 주시면 500GB와 같은 거대한 크기의 파일이 없으므로 테스트 할 수 없습니다. Input_file에서 내부 대체를 사용하지 않으므로 백엔드에 임시 파일을 생성해서는 안됩니다.

awk 'FNR==1{$1="bar";print;next} 1' Input_file > temp_file && mv temp_file Input_file 
+0

@ RavinderSingh13 감사합니다. 이 명령은이 문제를 처리 할 수 ​​있지만 속도는 향상되지 않습니다. 토마스 (Thomas)가 말했듯이, 나는 찌르는 길이를 변하지 않은 이상 그렇게 할 수있는 더 좋은 방법이 없을 수도 있습니다. –