列6と7が対立遺伝子AとBの次の形式のファイルがあります。私がしなければならないことは、6列と7列の対立遺伝子に基づいて9列とそれ以降の内容を変更することだけです。 9列フィールドの値が0の場合は6列に置き換え、2の場合は7列に置き換えます。 -1の場合はそのままにし、1は6/7列で表示する必要があります。各行が終了するまで、すべてのフィールドに対してこの操作を繰り返す必要があります。参考のために、これらの行のいくつかを下に貼り付けました。 1行あたり約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