答案1
試試這個單行:
cut -f4 in.tsv | tail -n +2 | grep -P '\S'
詳細資訊:
cut -f4 in.tsv
:輸出輸入檔案的第四個製表符分隔列in.tsv
。
tail -n +2
:刪除第一行(標題)。
grep -P '\S'
:只保留有非空白字元的行,即刪除空白行。-P
告訴grep
我們使用 Perl 正規表示式。
如果您只需要唯一的基因名稱,請sort -u
像這樣添加:
cut -f4 in.tsv | tail -n +2 | grep -P '\S' | sort -u
答案2
目前尚不清楚您的要求是什麼。假設,排除第一行,只有第四列(標記為“基因”)的值,其第六列(標記為“產品”)的值與“假設蛋白質”不同
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'
列印第四列。
答案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 != ""
:如果第四個欄位不為空...{arr[$4] = 1}
: …使用它作為數組賦值中的索引。- 相同索引的後續實例將覆蓋數組條目,不儲存重複項。
- 指定的值 (
1
) 是任意的,0
或"blergh"
也可以正常運作。
END
:當所有行都讀完後...{for (idx in arr) print idx}
: ...列印所有索引。