用 gawk 更新 tab-delimited 文件 in-place

Update tab-delimited file in-place with gawk

我正在尝试使用 gawk 将字段 headers 添加到文件 in-place。输入 file 是制表符分隔的,所以我将其添加到命令中。如果我仅用 awk 替换 gawk -i inplace,则命令运行但 file 未更新。我知道 awk 没有像 sed 那样的 in-place 编辑,但是可以使用 gawk 还是有更好的方法?

gawk -i inplace '
BEGIN {FS = OFS = "\t"
}
NR == 1 {
= "Chr"
= "Start"
= "End"
= "Gene"
}
1' file

file(要更新的输入文件)

chr7    121738788   121738930   AASS
chr7    121738788   121738930   AASS
chr7    121738788   121738930   AASS

期望输出

Chr     Start       End         Gene
chr7    121738788   121738930   AASS
chr7    121738788   121738930   AASS
chr7    121738788   121738930   AASS

我使用 SO 问答 awk save modifications in place 作为指南,但未能解决我的问题。

awk 'BEGIN {print  "Chr\tStart\tEnd\tGene"}1' file > newFile && mv newFile file

输出

Chr     Start   End     Gene
chr7    121738788   121738930   AASS
chr7    121738788   121738930   AASS
chr7    121738788   121738930   AASS

您似乎最感兴趣的是添加 header 行,只需在任何事情发生之前打印出来(通过 BEGIN 块)。 1 是一个 "true" 语句,因此打印所有输入行(默认情况下)。如果你想要非 awk-gurus 能够理解的代码,你可以用长手 {print [=14=]} 替换它。

即使使用 -i inplace 选项,程序在幕后执行与 awk 'code' file > newFile && mv newFile file 相同的操作,因此在处理添加 header 时没有 "savings"到一个文件。在任何一种情况下都必须重写文件。

IHTH

这样做会更有效率:

cat - file <<<$'Chr\tStart\tEnd\tGene' > newfile && mv newfile file

完全没有 awk 参与。