答案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}
: ...打印所有索引。