如何使用 awk 将一个值替换为 gzip 文件中特定列中的另一个值?

How to replace a value to another value in a specific column on a gzipped file using awk?

我有一个压缩文件 (.gz) 该文件大约有 7000000 行,前几行如下所示:

CHROM   POS ID  REF ALT A1  TEST    OBS_CT  BETA    SE  T_STAT  P
1   54712   1:54712 TTTTC   T   ADD 1460    0.00428077  0.0561095   0.0762931   0.939196
1   825069  rs4475692   G   C   G   ADD 1460    -0.000411661    0.0413083   -0.00996558 0.99205
1   825410  rs13303179  G   A   G   ADD 1460    0.00489633  0.041967    0.116671    0.907137

文件末尾第一列有X

X   154929637   rs35185538:154929637:CT:C   CT  C   C   ADD 1460    0.0787708   0.0396199   1.98816 0.0469823
X   154929952   rs4012982:154929952:CAA:C   CAA C   C   ADD 1460    0.0265508   0.0522027   0.50861 0.611104
X   154930230   rs781880:154930230:A:G  A   G   G   ADD 1460    0.0827871   0.0356246   2.32387 0.0202707

我想将 X(仅 X)替换为 23 并保留 header。我试了没用。

gunzip -c file.gz | awk 'NR==1{gsub(/\X/,"23",)} 1' > out.txt

任何帮助将不胜感激。

阿维尼

您可以只检查第一列中的 X 并检查行号是否大于 1。

然后您可以使用 ^X 将字符串开头的 X 替换为 23。

awk 'NR > 1 && =="X" {sub(/^X/,"23")}1' > out.txt