Saya memiliki file yang dibatasi tab yang terlihat seperti ini:
gene v1 v2 v3 v4
g1 NA NA NA NA
g2 NA NA 2 3
g3 NA NA NA NA
g4 1 2 3 2
Jumlah bidang di setiap baris adalah tetap dan sama. Saya ingin menghapus baris-baris itu dari file di atas di mana semua bidang untuk setiap baris dari kolom 2 hingga terakhir adalah NA. Maka output akan terlihat seperti:
gene v1 v2 v3 v4
g2 NA NA 2 3
g4 1 2 3 2
text-processing
awk
perl
bioinformatics
pengguna3138373
sumber
sumber
\s\d
membedakan antara garis "baik" dan "buruk".is.na
memeriksa jika saya pikirJawaban:
Dengan
awk
:Ulangi bidang yang dimulai dari bidang kedua dan cetak baris jika bidang yang tidak berisi
NA
ditemukan. Kemudian pecahkan loop.sumber
Menggunakan GNU sed
Penjelasan singkat:
g[0-9]\+\(\s*NA\s*\)\+$
adalah pencocokan regexg
diikuti oleh setidaknya satu digit, kemudian sejumlahNA
s dengan spasi opsional antara hingga akhir baris.sed -e '/<regex>/d'
menghapus semua baris yang cocok<regex>
Regexp yang lebih standar dengan arti yang sama adalah:
sumber
\+
dan\s
merupakan ekspresi reguler non-standar dan akan cocok dengan yang sederhana+
ataus
dalam kebanyakansed
versi. Gunakan\{1,\}
alih-alih\+
dan[[:space:]]
alih-alih\s
memiliki kode portabel.Dengan
all
dari Perl List :: Util module:sumber
Dengan
grep
:Ini menyebabkan grep tidak menampilkan (
-v
) baris di mana seluruh baris (-x
) cocok:sumber
{4}
bukannya*
setelahNA
kelompok, dan Anda mungkin ingin mengubah yang pertama[[:blank:]]*
untuk[[:blank:]]+
membuat pemisah spasi wajib. Bagaimanapun, saya tidak pernah mengerti mengapa semua orang bersikeras mengeluarkanawk
bazooka untuk memecahkan masalah penyaringan sederhana yanggrep
mudah ditangani.*
sehingga solusi ini bekerja dengan baik untuk jumlahNA
kolom yang berubah-ubah , asalkan semuanya NA.Kamu bisa mencoba:
sumber