答え1
次の1行を試してください。
cut -f4 in.tsv | tail -n +2 | grep -P '\S'
詳細::
cut -f4 in.tsv
入力ファイルのタブで区切られた4番目の列を出力します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
あなたの要求が何であるかわからない。最初の行を除いて、4番目の列(「gene」で表される)の値が「仮説タンパク質」より6番目の列(「product」で表される)の値と異なると仮定します。
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}
:...すべてのインデックスを印刷します。