Saya mencoba untuk mengekstrak ID urutan dan nomor cluster yang terjadi pada baris yang berbeda dalam file teks yang sama.
Inputnya seperti
>Cluster 72
0 319aa, >O311_01007... *
>Cluster 73
0 318aa, >1494_00753... *
1 318aa, >1621_00002... at 99.69%
2 318aa, >1622_00575... at 99.37%
3 318aa, >1633_00422... at 99.37%
4 318aa, >O136_00307... at 99.69%
>Cluster 74
0 318aa, >O139_01028... *
1 318aa, >O142_00961... at 99.69%
>Cluster 75
0 318aa, >O300_00856... *
Output yang diinginkan adalah ID urutan dalam satu kolom dan nomor cluster yang sesuai di kolom kedua.
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Adakah yang bisa membantu dengan ini?
>
? Juga, Anda mungkin tertarik dengan situs saudara kami, Bioinformatika .Jawaban:
Dengan awk:
-F '[. ]*'
>Cluster
garis), simpan bidang kedua sebagai ID dan pindah ke baris berikutnyasumber
$1 == ">Cluster"
daripadaNF == 2
bergantung pada apa lagi yang mungkin ada dalam file.Anda dapat menggunakan
awk
ini:Pernyataan blok pertama adalah menangkap ID cluster. Pernyataan blok kedua (yang default) adalah mengekstraksi data yang diinginkan, dan mencetaknya.
sumber
" "
argumenprint
. Cukup gunakan koma untuk memisahkan argumen dan itu akan menggunakan OFS, ruang default, untuk memisahkan argumen.Berikut ini alternatif dengan Ruby sebagai satu-baris:
atau menyebar pada beberapa baris:
Saya kira itu hanya lebih mudah dibaca daripada
awk
versi jika Anda tahu Ruby dan regexen. Sebagai bonus, kode ini mungkin sedikit lebih kuat daripada hanya memisahkan garis, karena mencari teks di sekitarnya.sumber
Perl:
Penjelasan
perl -ne
: baca input file baris per baris (-n
) dan terapkan skrip yang diberikan oleh-e
untuk setiap baris.if(/^>.*?(\d+)/){$n=$1;}
: jika baris ini dimulai dengan a>
, cari rentangan angka terpanjang di akhir baris, dan simpan sebagai$n
.else{ s/.*(>[^.]+).*/$1 $n/; print
: jika garis tidak dimulai dengan>
, gantikan semuanya dengan bentangan non-.
karakter paling panjang setelah a>
(>[^.]+
), yaitu nama urutan ($1
karena kami telah menangkap pertandingan regex) dan nilai saat ini dari$n
.Atau, untuk pendekatan yang lebih mirip canggung:
Ini hanya cara yang sedikit lebih rumit untuk melakukan ide dasar yang sama dengan berbagai
awk
pendekatan. Saya memasukkannya untuk penyelesaian dan untuk penggemar Perl. Jika Anda membutuhkan penjelasan, gunakan saja solusi awk :).sumber