awk 用它旁边的值替换 header 中的值?

Awk to replace a value in the header with the value next to it?

我有一个如下所示的压缩文本文件 (chrall.txt.gz)。它有一个 header 行,其中包含每个人的 ID 对。例如。 1032 和 468768 是一个人的 ID。文件中有 1931 个人,因此总共有 3862 个 ID。每对对应一个个体。例如。下一个人是 1405 468769 等....

header之后是21465139行。我对文件的 lines/body 不感兴趣。只是 header

misc SNP pos A2 A1 1032 468768 1405 468769 1564 468770 1610 468771 998 468774 975 468775 1066 468776 1038 468778 1275 468781 999 468782 976 468783 1145 468784 1141 468786 1280 468789 910 468790 978 468791 1307 468792 ...

--- rs1038757:1072:T:TA 1072 TA T 1.113 0.555 1.612 0.519 0.448 0.653 1.059 0.838 1.031 0.518 1.046 0.751 1.216 1.417 1.008 0.917 0.64 1.04 1.113 1.398 1.173 0.956 …

我想替换一对中的每个第一个 ID,例如1032、1405、1564、1610、998、975 旁边是 ID。因此,每个 1、3、5、7、9 ID 等...都被替换为旁边的 ID。 所以它看起来像这样:

misc SNP pos A2 A1 468768 468768 468769 468769 468770 468770 468771 468771 468774 468774 468775 468775 468776 468776 468778 468778 468781 468781 468782 468782 468783 468783 468784 468784 468786 468786 468789 468789 468790 468790 468791 468791 468792 468792 

etc..

我完全不知道该怎么做。我的猜测是使用 awk/gsub 并将每第 n 次出现的 1、3、5、7、9 替换为它旁边的值...还需要忽略此位 misc SNP pos A2 A1

我的锻炼:

读取第一行并忽略前 5 个字段:

awk FNR==1'{ =""; =""; =""; =""; ="";}'

有人使用此代码将第 3 次出现替换为 A。我假设我将 3 替换为 2,因为我想每出现 2 次就替换一次,但唯一的问题是我也想替换第一个 ID。 ..

awk '{ c=0; for (i = 0; ++i <= NF;){ if( $i == v){c++;if(c%3==0){ $i = l }} } }1' OFS= FS= n=3 v=a l=c

replace nth occurrence of character in a file using awk regardless of the line

我不知道如何让它适应我的...

如果您不想替换前 5 个字段,则不要将它们包含在循环中,方法是从 6 开始循环,如果您想替换每个第二个字段,则只需将循环变量递增 2每次迭代:

$ awk 'NR==1{for (i=6;i<NF;i+=2) $i=$(i+1)} 1' file
misc SNP pos A2 A1 468768 468768 468769 468769 468770 468770 468771 468771 468774 468774 468775 468775 468776 468776 468778 468778 468781 468781 468782 468782 468783 468783 468784 468784 468786 468786 468789 468789 468790 468790 468791 468791 468792 468792 ...

--- rs1038757:1072:T:TA 1072 TA T 1.113 0.555 1.612 0.519 0.448 0.653 1.059 0.838 1.031 0.518 1.046 0.751 1.216 1.417 1.008 0.917 0.64 1.04 1.113 1.398 1.173 0.956 …