タブ区切りのファイルがあります。
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
フィールド区切り文字を設定します。その場合は、ラインを印刷してください。\t
NA
awk
答え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
オプションsed
RHS\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