我有一个包含超过 10,000 个条目的文件:
TRINITY_DN4798_c0_g1_i1.p1 GO:0046658
TRINITY_DN4798_c0_g1_i1.p1 GO:0046659
TRINITY_DN4326_c0_g1_i3.p1 GO:0003677|GO:0046983
TRINITY_DN4326_c0_g1_i3.p1 GO:0000977|GO:0045944
我正在尝试编辑我的文件使其看起来像这样:
TRINITY_DN4798_c0_g1_i1.p1 GO:0046658
TRINITY_DN4798_c0_g1_i1.p1 GO:0046659
TRINITY_DN4326_c0_g1_i3.p1 GO:0003677
TRINITY_DN4326_c0_g1_i3.p1 GO:0046983
TRINITY_DN4326_c0_g1_i3.p1 GO:0000977
TRINITY_DN4326_c0_g1_i3.p1 GO:0045944
我曾尝试使用 sed:
cat file | head | sed 's/|/\n/g'| sort -u
但得到输出:
GO:0045944
GO:0046983
TRINITY_DN4326_c0_g1_i3.p1 GO:0000977
TRINITY_DN4326_c0_g1_i3.p1 GO:0003677
TRINITY_DN4798_c0_g1_i1.p1 GO:0046658
TRINITY_DN4798_c0_g1_i1.p1 GO:0046659
需要帮助,谢谢。
答案1
您可以尝试以下操作:
sed -E 's/^(.*)(GO:.*)\|(.*)$/\1\2\n\1\3/'
输出:
TRINITY_DN4798_c0_g1_i1.p1 GO:0046658
TRINITY_DN4798_c0_g1_i1.p1 GO:0046659
TRINITY_DN4326_c0_g1_i3.p1 GO:0003677
TRINITY_DN4326_c0_g1_i3.p1 GO:0046983
TRINITY_DN4326_c0_g1_i3.p1 GO:0000977
TRINITY_DN4326_c0_g1_i3.p1 GO:0045944
答案2
使用 awk 的一种方法:
awk -F"[ |]" '{print $1 OFS $2}$3{print $1 OFS $3}' file
使用空格和竖线作为分隔符进行拆分。因此您最终会得到 3 个标记。打印第 1 个和第 2 个。只要存在第 3 个,就打印第 1 个和第 3 个。