之後如何為 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 的答案相比,即使對於很長的文件,它也能正常工作(他會先將文件加載到內存中,然後執行 echo;而且 bash 也有一些最大輸入長度)

答案4

經過更多谷歌搜尋後,我發現了這個問題: 更改大文件中的標頭而不重寫整份文件

為了防止在添加標頭時重寫整個文件,我在創建文件時打印了一個最小字節數的虛擬標頭(通過用零填充):

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是就地編輯的,我不必等待整個文件被複製,或者必須將其保留在記憶體中。

相關內容