2013-02-05 8 views
12

필자는 구분 된 텍스트 파일을 기반으로 한 가져 오기 시스템을 사용합니다. 사용되는 파일은 때로는 거의 2GB가 될 수 있으며 그 파일에서 몇 줄을 확인해야합니다. 그래서 특정 값의 행을 다른 파일 또는 화면에 출력 할 수 있는지 알고 싶습니다. 예 : 라인 번호 1010123, 1002451, 994123 등은 소스 파일에있는 그대로 사용 하시겠습니까?유닉스의 거대한 텍스트 파일에서 특정 라인을 얻는 방법은 무엇입니까?

답변

27

라인 N을 인쇄하려면, 사용 :

sed 'Nq;d' file 

여러 줄을 인쇄하려면 (그들은에있는 가정 오름차순) 예 994123, 1002451, 101:.

sed '994123p;1002451p;1010123q;d' file 

q 마지막 행 번호 대신 우리가에 관심이없는 나머지 라인을 통해 반복하여 시간을 낭비의 1010123th 라인에 도달하면 종료 sed 지시 후 즉 큰 파일에서 왜 효율적인지. 파이썬에서

+1

감사합니다. 그것은 매력처럼 작동했습니다 :) – BogdanM

3

당신은 awk으로 예를 들어, 많은 유닉스 도구를 사용하여이 작업을 수행 할 수 있습니다

# print first 5 lines with awk 
awk 'NR>=1&&NR<=5{print}NR>=6{exit}' file 

# print selection of lines 
awk 'NR==994123||NR==1002451||NR==1010123{print}NR>1010123{exit}' file 
+0

방법'sed' /'awk' 같은 매우 큰 파일에 수행 않습니다 (getline.py 1234 등) 인수와 함께 작동하도록 해당 스크립트를 수정할 수 있습니다 원한다면 그가 질문에서 언급 한 것들 (~ 2GB)? –

+0

줄 번호가 순차적이지 않습니다. 처음 N 번째 또는 마지막 N 번째가 아닙니다. 그들은 단지 오류가있는 행입니다. 나는 테이블에 행 번호를 가지고 있으며, 단지 특정 행 번호 만 출력하려고합니다. – BogdanM

+0

@ BogdanM이 두 번째'awk' 예제를 봅니다. (dogbane answers는 sed와 함께 보여줍니다.) 나는 인쇄 범위가 또한 당신에게 유용 할 것이라고 생각했습니다. –

0

:

readThisFile = open('YOURFILE') 
outputFile = open('OUTPUT', w) 

for actualline, linetext in enumerate(readThisFile): 
    if actualline == WANTEDLINE 
     outputFile.write(linetext) 
    else: 
     pass 

당신이

+0

질문에'unix' 태그가 붙어 있기 때문에'outputFile.write (linetext)'가 출력 된 후에 종료하는 것이 더 효율적입니다. 그래서 OP에는'Python'이 있습니다. –

+0

Python을 사용할 수 있는지 여부를 말할 수 없습니다 (그는 언어를 쓰고 싶은 언어를 말하지 않았습니다). 그리고 줄을 서서 끝내기 때문에 : 할 수는 있겠지만 제 스크립트는 "스크립트를 사용하고 복사하고 붙여 넣기 만하면됩니다"스크립트가 아니라 스크립트를 사용하여 어떻게 수행 할 수 있는지 알려주고 있습니다. – chill0r

관련 문제