나중에 awk 명령의 출력에 헤더를 추가하는 방법은 무엇입니까?

나중에 awk 명령의 출력에 헤더를 추가하는 방법은 무엇입니까?

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라는 파일에 원하는 헤더가 있는 경우 다음을 사용하여 헤더를 삽입할 수 있습니다.headerprintf "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은 그 자리에서 편집되므로 전체 파일이 복사될 때까지 기다리거나 메모리에 보관할 필요가 없습니다.

관련 정보