将每行中的字段值替换为之前字段中的值,直到每行末尾

将每行中的字段值替换为之前字段中的值,直到每行末尾

我有一个以下格式的文件,其中第 6 列和第 7 列是等位基因 A 和 B。我需要做的就是根据第 6 列和第 7 列中的等位基因在第 9 列及以后进行更改。如果第 9 列字段值为0 然后将其替换为第 6 列,如果是 2,则将其替换为第 7 列。如果是 -1,则应保留原样,而 1 应标记为第 6 列/第 7 列。我必须对所有内容重复执行此操作每个字段直到每行末尾。下面粘贴了一些这样的行供您参考。每行大约有 130 个字段。

Probe Set ID    Affy SNP ID     Chromosome      Physical Position       Flank   Allele A        Allele B        probeset_id     SunOleic97R     NC94022 S1      S2      S3      S4      S9      S11     S14 
AX-147208720    Affx-152069361  Aradu.A01       5066618 TTTCTTGGCGGCATTGCTGATTTCTTATCATCCAA[A/G]CCATTCTTCTTTGTGTCAGGGTGGAATCTAAAATT     A       G       AX-147208720    0       2       0       0       2
AX-147209428    Affx-152065184  Aradu.A01       9154456 TAGCTGTTGACATGTCAATTGCTAAGGGAGAGTCC[C/T]TTGGAAAGCCCTACATCATTCATCAAATCATTCTC     T       C       AX-147209428    2       0       2       0       0
AX-147209429    Affx-152069061  Aradu.A01       9155638 TCAGCAAATGAACCTCTTAAGAAACCAATTCGGTC[A/G]TTGCTTATCACTAAGCTTTCAATCCCTTTCACTGG     A       G       AX-147209429    2       0       2       0       0
AX-147209430    Affx-152031763  Aradu.A01       9157305 CGGCGCTCTAAAATCCAGATAACAACTCCAACAAC[C/T]AAGAAAAAGGTTGCTGTGACAAACCACATCATTGG     T       C       AX-147209430    2       0       2       0       0
AX-147209432    Affx-152067683  Aradu.A01       9205209 CCCTTAATTGGGGAAGAGAGTTGTTCCACTGTGAG[A/G]ATTGATGTTAGGCTTGCAATGTAGCTTGAATTCAG     A       G       AX-147209432    2       0       2       0       0
AX-147209600    Affx-152035192  Aradu.A01       9873259 CTCCTTCTCTCGGTTTCCAAGACAAAAGAAAGACA[A/G]ATATCTTTTAAGATCTTCCTCAGTTTTGTTCTCCC     A       G       AX-147209600    2       0       0       0       0
AX-147209601    Affx-152067325  Aradu.A01       9873427 TGGCCACATTGGAACCACAACATACACAGTGAAGT[C/T]TTGCTTAGCTTTAATCTTGCTAACAATTTTAAGTG     T       C       AX-147209601    2       0       0       0       0
AX-147209615    Affx-152066978  Aradu.A01       9974460 AAAACTCACAATTCTTCTTTGATGATCTGAGTCCT[C/T]TCCATTTGACAATTTAGCATCCACCACCACAATCT     T       C       AX-147209615    0       2       2       2       2

我最初尝试使用以下方法根据第 9 列中的值替换该字段的值:

awk '{if ($9 == 0) print $9 == $6}; 1' file.txt |less -S 

它没有对原始文件进行任何更改。谁能帮帮我吗!

答案1

让我们一步一步来

如果第 9 列 ($i) 字段值为 0,则将其替换为第 6 列

if ( $i == 0 ) $i=$6 ;

如果是 2,则将其替换为第 7 列。

if ( $i == 2 ) $i=$7 ;

如果它是 -1 那么它应该保持原样

# 

1 应标记为第 6 列/第 7 列。

if ( $i == 1 ) $i=$6 "/" $7 ;

我必须对每个字段中的所有字段重复执行此操作,直到每行末尾。

NR>1  {for(i=9;i<=NF;i++)
        {  } ## ifs ;
       ## for loop is done
       print ; ## print to be done at end of loop.
       } 

全部一起,

将所有这些行放入一个文件中a.awk

NR>1  {for(i=9;i<=NF;i++)
        { if ( $i == 0 ) $i=$6 ;
          if ( $i == 2 ) $i=$7 ;
          if ( $i == 1 ) $i=$6 "/" $7 ;
       } ## if ;
       ## for loop is done
       print ;
       } 

在哪里

  • NF是“字段数”的内置函数
  • print将打印

使用您的样本数据

awk -f a.awk sample.txt 
AX-147208720 Affx-152069361 Aradu.A01 5066618 TTTCTTGGCGGCATTGCTGATTTCTTATCATCCAA[A/G]CCATTCTTCTTTGTGTCAGGGTGGAATCTAAAATT A G AX-147208720 A G A A G
AX-147209428 Affx-152065184 Aradu.A01 9154456 TAGCTGTTGACATGTCAATTGCTAAGGGAGAGTCC[C/T]TTGGAAAGCCCTACATCATTCATCAAATCATTCTC T C AX-147209428 C T C T T
AX-147209429 Affx-152069061 Aradu.A01 9155638 TCAGCAAATGAACCTCTTAAGAAACCAATTCGGTC[A/G]TTGCTTATCACTAAGCTTTCAATCCCTTTCACTGG A G AX-147209429 G A G A A
AX-147209430 Affx-152031763 Aradu.A01 9157305 CGGCGCTCTAAAATCCAGATAACAACTCCAACAAC[C/T]AAGAAAAAGGTTGCTGTGACAAACCACATCATTGG T C AX-147209430 C T C T T
AX-147209432 Affx-152067683 Aradu.A01 9205209 CCCTTAATTGGGGAAGAGAGTTGTTCCACTGTGAG[A/G]ATTGATGTTAGGCTTGCAATGTAGCTTGAATTCAG A G AX-147209432 G A G A A
AX-147209600 Affx-152035192 Aradu.A01 9873259 CTCCTTCTCTCGGTTTCCAAGACAAAAGAAAGACA[A/G]ATATCTTTTAAGATCTTCCTCAGTTTTGTTCTCCC A G AX-147209600 G A A A A
AX-147209601 Affx-152067325 Aradu.A01 9873427 TGGCCACATTGGAACCACAACATACACAGTGAAGT[C/T]TTGCTTAGCTTTAATCTTGCTAACAATTTTAAGTG T C AX-147209601 C T T T T
AX-147209615 Affx-152066978 Aradu.A01 9974460 AAAACTCACAATTCTTCTTTGATGATCTGAGTCCT[C/T]TCCATTTGACAATTTAGCATCCACCACCACAATCT T C AX-147209615 T C C C C

请注意,awk 不会编辑原始文件。你必须使用:

awk -f a.awk file1.txt > file2.txt
cp file2.txt file1.txt
rm file2.txt

相关内容