awk를 사용하여 두 파일을 병렬로 반복하고 일치 및 불일치를 인쇄합니다.

awk를 사용하여 두 파일을 병렬로 반복하고 일치 및 불일치를 인쇄합니다.

두 개의 파일이 있고 이 파일을 한 줄씩 내 명령으로 병렬로 읽고 싶습니다. 이 명령은 독립형으로 실행됩니다.

첫 번째 인수는 첫 번째 열에서 일치하고 data.file에서 열 9를 인쇄하려면 열 4와 5의 두 숫자 비교와 일치해야 합니다. 이것은 실제로 작동합니다.

awk '$1=="argument1" && $4<"argument2" && $5>"argument3" {print f} {f=$9}' ../data.file >> OUTPUT.txt

1)지금 실행하여 매개변수를 변수로 바꾸고 두 개의 다른 파일의 입력을 사용하고 싶습니다. 이 같은:

cat FILE1a FILE2a | while read FILE1 && read FILE2; do
awk -v j="$FILE1" -v i="$FILE2" '$1==j && $4<i && $5>i {print f} {f=$9}' ../data.file >> OUTPUT.txt
done

그러나 어떤 이유로 나는 어떤 결과도 얻지 못합니다. "and"를 사용하여 변수를 작성해 보았지만 여기서는 출력을 얻을 수 없습니다. 이 문제를 해결하는 방법을 알려주실 수 있나요? 매우 감사합니다.

2)또한 매개변수가 다음과 같이 일치하지 않는 경우 "no_match_found"를 인쇄하고 싶습니다.

awk '$1=="argument1" && $4<"argument2" && $5>"argument3" {print f} {f=$9} END { if (!p) print "No_match_found"}' ../data.file >> OUTPUT.txt 

이는 명령에 대해 작동하는 것으로 보이지만 일치하는 항목이 없을 때뿐만 아니라 실제로 일치하는 항목이 발견된 경우에도 "No_match_found"를 인쇄합니다. 조금 혼란스러워요.

따라서 전체 명령은 다음과 같아야 하지만 작동하게 할 수는 없습니다.

cat FILE1a FILE2a | while read FILE1 && read FILE2; do
awk -v j="$FILE1" -v i="$FILE2" '$1==j && $4<i && $5>i {print f} {f=$9} END { if (!p) print "No_match_found"}' ../data.file >> OUTPUT.txt
done

어떤 도움이라도 대단히 감사하겠습니다.

다음은 이러한 파일의 예입니다. 파일 1

scaffold100
scaffold100
scaffold100
scaffold110
scaffold127

파일 2

20331
63580
82754
80477
114357

데이터 파일

scaffold100 RGF GHT 267634  268411  .   -   .   ID=scaffold100.13_LINE-1_reverse_transcriptase-like
scaffold100 RGF GHT 269975  271003  .   -   .   ID=scaffold100.14_LINE-1_reverse_transcriptase-like
scaffold100 RGF GHT 272492  272848  .   -   .   ID=scaffold100.15_Pleckstrin-likey_domain-containing_protein_1
scaffold100 RGF GHT 276355  277065  .   -   .   ID=scaffold100.16_NA
scaffold100 RGF GHT 278580  281340  .   -   .   ID=scaffold100.17_putative_RNA_pseudouridine_synthase_YlyB
scaffold100 RGF GHT 296344  308565  .   -   .   ID=scaffold100.18_Outer_membrane_protein_assembly_factor_BamB
scaffold100 RGF GHT 324074  337460  .   -   .   ID=scaffold100.19_hypothetical_protein_AK812_SmicGene20166
scaffold100 RGF GHT 344155  379840  .   -   .   ID=scaffold100.20_Procollagen_galactosyltransferase_1
scaffold100 RGF GHT 392748  402819  .   -   .   ID=scaffold100.21_Alkylated_DNA_repair_protein_alkB-like_8
scaffold100 RGF GHT 404481  415086  .   -   .   ID=scaffold100.22_Voltage-dependent_P/Q-type_calcium_channel_subunit_alpha-1A
scaffold100 RGF GHT 461507  466605  .   -   .   ID=scaffold100.23_hypothetical_protein_AK812_SmicGene32864
scaffold100 RGF GHT 20321   21040   .   -   .   ID=scaffold100.3_Gamma-tubulin_complex_component_4-like
scaffold100 RGF GHT 53560   69701   .   -   .   ID=scaffold100.4_COBW_domain-containing_protein_1
scaffold100 RGF GHT 72734   97123   .   -   .   ID=scaffold100.5_Polycystin-2
scaffold127 RGF GHT 106337  122095  .   -   .   ID=scaffold127.6_Histone-lysine_N-methyltransferase_SMYD3
scaffold127 RGF GHT 155484  177458  .   +   .   ID=scaffold127.9_Tetratricopeptide_repeat

원하는 출력:

ID=scaffold100.3_Gamma-tubulin_complex_component_4-like
ID=scaffold100.4_COBW_domain-containing_protein_1
ID=scaffold100.5_Polycystin-2
No_match_found
ID=scaffold127.6_Histone-lysine_N-methyltransferase_SMYD3

답변1

$ cat tst.awk
NR==FNR {
    ++cnt[$1]
    beg[$1,cnt[$1]] = $4
    end[$1,cnt[$1]] = $5
    map[$1,$4,$5] = $9
    next
}
{
    result = "No_match_found"
    for (i=1; i<=cnt[$1]; i++) {
        if ( (beg[$1,i] < $2) && ($2 < end[$1,i]) ) {
            result = map[$1,beg[$1,i],end[$1,i]]
            break
        }
    }
    print result
}

.

$ paste file1 file2 | awk -f tst.awk data.file -
ID=scaffold100.3_Gamma-tubulin_complex_component_4-like
ID=scaffold100.4_COBW_domain-containing_protein_1
ID=scaffold100.5_Polycystin-2
No_match_found
ID=scaffold127.6_Histone-lysine_N-methyltransferase_SMYD3

관련 정보