両方の列に文字列を含む行を削除する

両方の列に文字列を含む行を削除する

タブ区切りのファイルがあります。

TRINITY_DN42298_c0_g1_i1.p1 NA  NA
TRINITY_DN12995_c0_g1_i1.p1 PF06799 NA
TRINITY_DN2326_c0_g1_i4.p3  NA  NA
TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN2787_c0_g1_i2.p1  NA  NA
TRINITY_DN29879_c0_g1_i3.p1 PF01657 NA
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

列2と列3の両方からNAを含む行を削除したいと思います。

TRINITY_DN12995_c0_g1_i1.p1 PF06799 NA
TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN29879_c0_g1_i3.p1 PF01657 NA
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

試験を終えた

sed -i '/NA/d' ./file.txt

答え1

あなたは試すことができますawk

awk -F'\t' '!($2 == "NA" && $3 == "NA")' file

このオプションは、2番目と3番目のパラメータを取り、その内容が両方でないことを確認できるように-Fフィールド区切り文字を設定します。その場合は、ラインを印刷してください。\tNAawk

答え2

スクリプトは1つだけを含む行も削除するため、区切りNA文字(スペース?タブ?など)で区切って別の行を追加し、フィールド2と3になるように行の[[:space:]]*末尾に変更します。$

sed -i '/NA[[:space:]]*NA$/d' file.txt

答え3

次のように、さまざまな方法でこれを実行できます。

$ grep -vP '^(?:(?!\t).)+\tNA\tNA(?=\t|$)' inp.tsv

$ sed -Ee 'h;s/\t/\n/;s/$/\t/;/\n(NA\t)\1/d;g' inp.tsv

$ perl -F'\t' -lane 'print if 2 != grep { /^NA$/ } @F[1,2]' inp.tsv

$ perl -MList::MoreUtils=any -F'\t' -lane 'print if any { ! /^NA$/ } @F[1,2]' inp.tsv

   # fs => field separator set to a TAB
   # nT => not TAB
   # F  => consecutive run of non TABs, a field
$ fs="`echo x | tr x '\011'`"; nT="[^${fs}]"; F="$nT$nT*"
$ sed -e "/^$F${fs}NA${fs}NA\$/d" -e "/^$F${fs}NA${fs}NA${fs}/d";exit

結果:

TRINITY_DN12995_c0_g1_i1.p1 PF06799 NA
TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN29879_c0_g1_i3.p1 PF01657 NA
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

仮定:

  • 先行タブなし
  • Unixスタイルの行末=>改行=\012
  • LC_ALL=T に設定されたロケール
  • 入力ファイルをユーザーが読み取ることができます。
  • grepバージョンサポート-Pオプション
  • sedRHS\tなどの非POSIX構造をサポートしています。\n(...)
  • bash|shコマンドラインから実行

答え4

以下のコマンドを試してみましたが、うまくいきました。

注文する

awk '$2 != "NA" && $3 != "NA" {print $0}'  filename

出力

TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

関連情報