awk를 사용하여 여러 텍스트 파일에서 두 번째 줄과 마지막 세 줄을 인쇄하는 데 문제가 있습니다. 또한 출력을 텍스트 파일로 보내고 싶습니다.여러 텍스트 파일의 두 번째 줄과 마지막 줄을 어떻게 인쇄합니까?
어떤 도움이나 제안을 감상 할 수있다.
awk를 사용하여 여러 텍스트 파일에서 두 번째 줄과 마지막 세 줄을 인쇄하는 데 문제가 있습니다. 또한 출력을 텍스트 파일로 보내고 싶습니다.여러 텍스트 파일의 두 번째 줄과 마지막 줄을 어떻게 인쇄합니까?
어떤 도움이나 제안을 감상 할 수있다.
뭔가를해야합니다 같아요.
다음은 AWK의 다른 버전에 이식되는 gawk
매뉴얼에서 일부 코드를 사용하여 편집
awk 'NR == 2 {print}; {line1 = line2; line2 = line3; line3 = $0} END {print line1; print line2; print line3}' files*
. 파일 단위 처리 기능을 제공합니다. gawk
버전 4가 BEGINFILE
및 ENDFILE
규칙을 제공합니다.
#!/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)
: 한 번에 전체 파일을 메모리로 읽어 방지하기 위해
답변 해 주셔서 감사합니다. 나는 awk의 초보자입니다. 여러 파일에 대한 코드를 어떻게 바꿀 수 있습니까? 스프레드 시트 나 텍스트 파일로 출력물을 가져와야합니다. – sagar
@sagar : 내 수정 된 답변을 참조하십시오. –
이 작동 것이다, 그러나 당신의 파일이 매우 큰 경우에 적합하지 않을 수 있습니다 메모리에 전체 파일을로드 않습니다.
text = filename.readlines()
print text[2] # print second line
for i in range(1,4): # print last three lines
print text[-i]
here에 대한 몇 가지 좋은 대안도 있습니다.
은 내가 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()
는 지난 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을 그 어떤 반복자를 취할 것
구현을 위해 Python이나 AWK를 사용하지 않는다면 쉘과 표준 head/tail 유틸리티를 사용하여 매우 간단하게 작업 할 수 있습니다.
for file in "[email protected]"; do
head -n2 "$file" | tail -n1
tail -n3 "$file"
done
또한 기능이 포장 또는 스크립트에 배치하고 당신이 정말로 원하는 경우 subprocess.check_output() 파이썬이나 AWK 내에서 호출하지만, 이러한 경우에 그냥 네이티브를 사용하는 것이보다 쉬울 수 있습니다 할 수 있습니다 메서드를 사용하여 외부 프로세스를 생성 할 수 있습니다.
예상 출력? –
"테이블"이 의미하는 바를 명확히하십시오. SQL 테이블? 특정 언어 형식? 스프레드 시트? 꽤 인쇄 된 텍스트? –
의견을 보내 주셔서 감사합니다. 스프레드 시트가 필요합니다. – sagar