我使用 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 的答案相比,即使對於很長的文件,它也能正常工作(他會先將文件加載到內存中,然後執行 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
是就地編輯的,我不必等待整個文件被複製,或者必須將其保留在記憶體中。