使用gawk就地更新制表符分隔文件

时间:2016-07-15 14:55:42

标签: gawk

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

gawk -i inplace '
BEGIN {FS = OFS = "\t"
}
NR == 1 {
$1= "Chr"
$2= "Start"
$3= "End"
$4= "Gene"
}
1' 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 Q& A awk save modifications in place作为指南,但未能解决我的问题。

2 个答案:

答案 0 :(得分:1)

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

由于您似乎最感兴趣的是添加标题行,只需在发生任何事情之前打印(通过BEGIN块)。 1是一个“true”语句,因此打印所有输入行(默认情况下)。如果你想要非awk-gurus会理解的代码,你可以用长手{print $0}替换它。

即使使用-i inplace选项,程序也会在幕后与awk 'code' file > newFile && mv newFile file执行相同操作,因此在向文件添加标头的过程中没有“节省”。在任何一种情况下都必须重写该文件。

IHTH

答案 1 :(得分:1)

这样做更有效率:

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

根本没有涉及到awk。