Saya ingin mengulang file1, yang memiliki dua kolom. Setiap kolom memiliki string yang ingin saya gunakan untuk mencari dalam file dataframe (file2) dengan 18 kolom. Saya ingin memilih baris dari file2 yang memiliki kedua string dari file1 di dua kolom berbeda untuk membuat file baru.

File1 (file yang dipisahkan tab dengan sekitar 150 baris, tidak memiliki header)

#region      motif
Exon         ATG
Exon         CTG
5' UTR       GCC
3' UTR       GGC

File2 (file yang dipisahkan tab dengan sekitar 1,5 juta baris - memiliki header) Ada 18 kolom. Kolom 18 memiliki informasi wilayah dari file1, dan kolom 15 memiliki informasi motif dari file 1.

chr start   end period  copyNum consensusSize   perMatch    perIndel    score   A   C   G   T   entropy motif   sequence    ID  region
chr1    15798   15822   3   8.3 3   77  0   29  0   40  20  40  1.52    TGC TGCTCCTGCTCCTTCTGCTGCTGCT   chr1_15798_15822_TGC    Exon
chr9    140196426   140196441   3   5.3 3   84  0   25  0   31  62  6   1.2 GGC GGCGGCGGCTGCGGCG    chr9_140196426_140196441_GGC    5' UTR
chr1    19282560    19282579    3   6.7 3   76  0   26  5   40  25  30  1.77    CTG CTGCTGCTGCTCCAGCTGCT    chr1_19282560_19282579_CTG  Exon
chr8    131028679   131028694   3   5.3 3   100 0   32  0   62  37  0   0.95    GCC GCCGCCGCCGCCGCCG    chr8_131028679_131028694_GCC    5' UTR

Output yang diharapkan adalah menyertakan semua kolom dari file2, tetapi hanya baris yang cocok dengan file 1 pada kedua string. Dari contoh, baris 3 dan 4 dari file2 harus ada di output.

Ketika saya melakukannya secara manual tanpa melalui loop, itu berfungsi dengan baik. Tapi begitu di loop saya mendapatkan file output kosong. Inilah yang saya coba sejauh ini:

while read REGION MOTIF; do
       awk '$18 == "'${REGION}'" && $15 == "'${MOTIF}'"' file2 >> output.txt
done < file1.txt

I get the following errors:
awk: cmd. line:1: ($18 == "Exon" && $15 == "CAG
awk: cmd. line:1:                          ^ unterminated string
awk: cmd. line:1: ($18 == "5'" && $15 == "UTR
awk: cmd. line:1:                        ^ unterminated string

Juga mencoba yang berikut ini tanpa kesalahan tetapi file keluaran kosong:

while read REGION MOTIF; do
       awk -v a="$REGION" -v b="$MOTIF" '($18 == a && $15 == b)' file2.txt >> output.txt
done < file1.txt

Jika saya melakukan satu baris di baris perintah, itu berfungsi. Jadi ini ada hubungannya dengan bagaimana variabel wilayah dan motif diteruskan ke awk, saya percaya. Yang tidak bekerja secara manual adalah UTR 5' dan UTR 3', karena mereka memiliki kutipan tunggal, kurasa.

awk '($18 == "Exon" && $15 == "CTG")' file2.txt > output.txt

or

awk -v a="Exon" -v b="CAG" '($18 == a && $15 == b)' file2.txt > output.txt

awk
1
Sarah 12 Mei 2021, 18:00

1 menjawab

Jawaban Terbaik

Anda dapat mencoba awk ini yang menyimpan semua nilai dari kolom pertama di larik region dan kolom ke-2 di larik motif saat melewati file1. Kemudian kami mencetak catatan dari file2 jika $18 ditemukan dalam larik region dan $15 ditemukan dalam larik motif:

awk -F'\t' 'NR==FNR {region[$1]; motif[$2]; next}
$18 in region && $15 in motif' file1 file2

Keluaran:

chr1    15798   15822   3   8.3 3   77  0   29  0   40  20  40  1.52    CTG TGCTCCTGCTCCTTCTGCTGCTGCT   chr1_15798_15822_TGC    Exon
1
anubhava 12 Mei 2021, 15:22