答え1
次のワンライナーを試してみてください:
cut -f4 in.tsv | tail -n +2 | grep -P '\S'
詳細:
cut -f4 in.tsv
: 入力ファイルの 4 番目の TAB 区切り列を出力しますin.tsv
。
tail -n +2
: 最初の行 (ヘッダー) を削除します。
grep -P '\S'
: 空白文字以外の行のみを保持します。つまり、空白行を削除します。Perl 正規表現を使用するように -P
指示します。grep
一意の遺伝子名のみが必要な場合は、sort -u
次のように追加します。
cut -f4 in.tsv | tail -n +2 | grep -P '\S' | sort -u
答え2
要件が明確ではありません。最初の行を除いて、6番目の列(「製品」というラベル)の値が「仮想タンパク質」と異なるのは、4番目の列(「遺伝子」というラベル)の値のみであると仮定します。
grep -v "hypothetical protein" < <(tail -n +2 file.tsv) | cut -f4 -d$'\t'
説明
tail -n +2 file.tsv
最初の行 ("locus_tag"、"type" など) を除外します。
grep -v "hypothetical protein"
「仮想タンパク質」文字列を含むすべての行を除外します
cut -f4 -d$'\t'
4番目の列を出力します。
答え3
これは のタスクのようですawk
。次のことを試してみてください:
awk '{if ($4); print $4 $7}' filename.tsv
コメントからの有益な提案に従って:
awk 'BEGIN { FS = "\t" } ; $4 != "" { print $4 "\t" $7}'
答え4
awk の使用:
awk -F'\t' '$4 != "" {arr[$4] = 1} END {for (idx in arr) print idx}' file.tsv
-F'\t'
: タブで分割します。$4 != ""
: 4番目のフィールドが空でない場合…{arr[$4] = 1}
: …配列割り当てのインデックスとして使用します。- 同じインデックスの後続のインスタンスは配列エントリを上書きし、重複は保存されません。
- 割り当てられた値 (
1
) は任意です0
が、その"blergh"
ままでも同様に機能します。
END
: すべての行が読み終わったら…{for (idx in arr) print idx}
: …すべてのインデックスを印刷します。