2012-06-16 4 views
0

awk를 사용하여 여러 텍스트 파일에서 두 번째 줄과 마지막 세 줄을 인쇄하는 데 문제가 있습니다. 또한 출력을 텍스트 파일로 보내고 싶습니다.여러 텍스트 파일의 두 번째 줄과 마지막 줄을 어떻게 인쇄합니까?

어떤 도움이나 제안을 감상 할 수있다.

+0

예상 출력? –

+1

"테이블"이 의미하는 바를 명확히하십시오. SQL 테이블? 특정 언어 형식? 스프레드 시트? 꽤 인쇄 된 텍스트? –

+0

의견을 보내 주셔서 감사합니다. 스프레드 시트가 필요합니다. – sagar

답변

3

뭔가를해야합니다 같아요.

다음은 AWK의 다른 버전에 이식되는 gawk 매뉴얼에서 일부 코드를 사용하여 편집

awk 'NR == 2 {print}; {line1 = line2; line2 = line3; line3 = $0} END {print line1; print line2; print line3}' files* 

. 파일 단위 처리 기능을 제공합니다. gawk 버전 4가 BEGINFILEENDFILE 규칙을 제공합니다.

#!/usr/bin/awk -f 
function beginfile (file) { 
    line1 = line2 = line3 = "" 
} 

function endfile (file) { 
    print line1; print line2; print line3 
} 

FILENAME != _oldfilename \ 
    { 
     if (_oldfilename != "") 
      endfile(_oldfilename) 
     _oldfilename = FILENAME 
     beginfile(FILENAME) 
    } 

    END { endfile(FILENAME) } 

FNR == 2 { 
    print 
} 

{ 
    line1 = line2; line2 = line3; line3 = $0 
} 

"fileparts"라고하는 파일로 저장하십시오.

chmod u+x fileparts 

은 그럼 당신은 할 수 있습니다 :

./fileparts file1 file2 anotherfile somemorefiles*.txt 

을하고 출력합니다 두 번째 줄과 출력 한 세트에있는 각 파일의 마지막 세 줄 그런 않습니다.

또는 파일을 별도의 출력을 수정하거나 별도의 파일로 출력 쉘 루프를 사용할 수 있습니다

for file in file1 file2 anotherfile somemorefiles*.txt 
do 
    ./fileparts "$file" > "$file.out" 
done 

당신은 당신이 좋아하지만 출력 파일 이름을 지정할 수 있습니다. 텍스트 파일입니다. 당신은 함수에이 방법을 일반화 할 수

from collections import deque 
def get2ndAndLast3LinesFrom(filename): 
    with open(filename) as infile: 
     # advance past first line 
     next(infile) 
     # capture second line 
     second = next(infile) 
     # iterate over the rest of the file a line at a time, saving the final 3 
     last3 = deque(maxlen=3) 
     last3.extend(infile)   
     return second, list(last3) 

: 한 번에 전체 파일을 메모리로 읽어 방지하기 위해

+0

답변 해 주셔서 감사합니다. 나는 awk의 초보자입니다. 여러 파일에 대한 코드를 어떻게 바꿀 수 있습니까? 스프레드 시트 나 텍스트 파일로 출력물을 가져와야합니다. – sagar

+0

@sagar : 내 수정 된 답변을 참조하십시오. –

0

이 작동 것이다, 그러나 당신의 파일이 매우 큰 경우에 적합하지 않을 수 있습니다 메모리에 전체 파일을로드 않습니다.

text = filename.readlines() 

print text[2] # print second line 

for i in range(1,4): # print last three lines 
    print text[-i] 

here에 대한 몇 가지 좋은 대안도 있습니다.

0

은 내가 AWK에 대해 알고하지 않습니다하지만 당신은 파이썬을 사용하는 경우 난 당신이 전체 파일이 메모리에 저장되지 않는 장점이있다이

inf = open('test1.txt','rU') 
lines = inf.readlines() 
outf = open('Spreadsheet.ods','w') 
outf.write(str(lines[1])) 
outf.write(str(lines[-3])) 
outf.write(str(lines[-2])) 
outf.write(str(lines[-1])) 
outf.close() 
inf.close() 
0

는 지난 3 개 라인을 캡처 롤링 버퍼를 생성하기 위해 3의 MAXLEN이있는 양단 큐를 사용

def lastN(n, seq): 
    buf = deque(maxlen=n) 
    buf.extend(seq) 
    return list(buf) 

는 그런 다음 "마지막 N"기능을 부분적으로 사용하여 서로 다른 길이를 만들 수 있습니다 :

from functools import partial 
last3 = partial(lastN, 3) 

print last3(xrange(100000000)) # or just use range in Py3 
,369을 그 어떤 반복자를 취할 것
1

구현을 위해 Python이나 AWK를 사용하지 않는다면 쉘과 표준 head/tail 유틸리티를 사용하여 매우 간단하게 작업 할 수 있습니다.

for file in "[email protected]"; do 
    head -n2 "$file" | tail -n1 
    tail -n3 "$file" 
done 

또한 기능이 포장 또는 스크립트에 배치하고 당신이 정말로 원하는 경우 subprocess.check_output() 파이썬이나 AWK 내에서 호출하지만, 이러한 경우에 그냥 네이티브를 사용하는 것이보다 쉬울 수 있습니다 할 수 있습니다 메서드를 사용하여 외부 프로세스를 생성 할 수 있습니다.

관련 문제