나는 awk를 사용하여 다른 파일(입력)에서 파일(출력)을 생성합니다(헤더 건너뛰기).
awk 'NR==1{next} $3==1 {print $1"\t"$2}' input > output
그런 다음 나중에 계산할 수 있는 헤더 정보를 얻었고 sed를 사용하여 이를 추가했습니다.
sed -i "1s/^/head1\thead2\n/" output
하지만 sed는 매우 느리므로 더 좋은 방법이 있는지 궁금합니다. awk 결과를 저장한 다음 헤더 정보를 얻은 후 파일에 쓰는 것과 같나요?
답변1
파일에 본문이 있고 output
필수 헤더가 ( )라는 파일에 있는 경우 다음을 사용하여 헤더를 삽입할 수 있습니다.header
printf "head1\thead2\n" > header
ed -s output <<< $'0r header\nw\nq'
진단 출력을 억제함을 나타냅니다 -s
. 이는 에서 읽은 바이트 수 output
, 에서 읽은 바이트 수, header
마지막으로 쓴 바이트 수입니다.
ed 명령은 다음과 같습니다.
0r header
- 0번째 줄에서 파일 내용을 읽습니다.header
w
- 파일 쓰기q
- 편집 종료
답변2
사용해 보세요세게 때리다:
echo -e "head1\thead2\n$(cat output)" > /tmp/out && mv /tmp/out output
답변3
나는 bash에서 할 것이다
{ echo -e "head1\thead2" ; cat output ; } > newoutput
RomanPerekhrest의 답변과 비교하면 매우 긴 파일에서도 잘 작동합니다. (그는 먼저 파일을 메모리에 로드한 다음 에코를 수행하고 bash에는 최대 입력 길이도 있습니다)
답변4
좀 더 인터넷 검색을 한 후에 다음 질문을 발견했습니다. 전체 파일을 다시 쓰지 않고도 대용량 파일의 헤더를 변경할 수 있습니다..
헤더를 추가할 때 전체 파일이 다시 작성되는 것을 방지하기 위해 파일을 생성할 때 (0으로 채워서) 최소 바이트 수의 더미 헤더를 인쇄합니다.
awk 'NR==1{print "dummyhead100\tdummyhead20000"; next} $3==1 {print
$1"\t"$2}' input > output
그런 다음 header.tsv라는 파일(또는 문자열 변수)을 새 헤더로 생성하고 다음을 사용하여 더미 헤더를 제자리에 바꿉니다(더미 헤더와 새 헤더의 바이트 수가 동일한지 확인한 후) dd
.
dd conv=notrunc obs=1 if=header.tsv of=output
이렇게 하면 output
해당 위치에서 편집되므로 전체 파일이 복사될 때까지 기다리거나 메모리에 보관할 필요가 없습니다.