열 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