그런 다음 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해당 위치에서 편집되므로 전체 파일이 복사될 때까지 기다리거나 메모리에 보관할 필요가 없습니다.

관련 정보