私は非常に似た問題がありますこの問題しかし、私の質問に対する答えを調整する方法がわかりません。
2番目の列には、カンマ区切りリストを含むタブ区切りファイルがあります。たとえば、次のようになります。
TRINITY_DN1_c0_g1 DN1_c0_g1 GO:0000166,GO:0003674,GO:0005488,GO:0005515,GO:0005524,GO:0005575
TRINITY_DN1_c0_g3 DN1_c0_g3 GO:0005829,GO:0006457,GO:0006458,GO:0006950,GO:0008134
TRINITY_DN10_c0_g1 DN10_c0_g1 GO:0050896,GO:0051082,GO:0051084,GO:0051085
私はこれをしたい:
TRINITY_DN1_c0_g1 DN1_c0_g1 GO:0000166
TRINITY_DN1_c0_g1 DN1_c0_g1 GO:0003674
TRINITY_DN1_c0_g1 DN1_c0_g1 GO:0005488
TRINITY_DN1_c0_g1 DN1_c0_g1 GO:0005515
TRINITY_DN1_c0_g1 DN1_c0_g1 GO:0005524
TRINITY_DN1_c0_g1 DN1_c0_g1 GO:0005575
TRINITY_DN1_c0_g3 DN1_c0_g3 GO:0005829
TRINITY_DN1_c0_g3 DN1_c0_g3 GO:0006457
TRINITY_DN1_c0_g3 DN1_c0_g3 GO:0006458
TRINITY_DN1_c0_g3 DN1_c0_g3 GO:0006950
TRINITY_DN1_c0_g3 DN1_c0_g3 GO:0008134
TRINITY_DN10_c0_g1 DN10_c0_g1 GO:0050896
TRINITY_DN10_c0_g1 DN10_c0_g1 GO:0051082
TRINITY_DN10_c0_g1 DN10_c0_g1 GO:0051084
TRINITY_DN10_c0_g1 DN10_c0_g1 GO:0051085
3番目の列の用語の数は可変です。接続された最初の列と2番目の列にはそれぞれ1行が必要です。
役立つ場合は、上記の質問の出発点は次のとおりです。
perl -lne 'if(/^(.*?: )(.*?)(\W*)$/){print"$1$_$3"for split/, /,$2}'
ところで、問題を解決するにはどの部分を変えなければならないのか分からない!
助けてくれてありがとう。
ベストアンサー1
この awk コマンドは非常に読みやすいです。
awk '
BEGIN {FS = "[,\t]"; OFS = "\t"}
{for (i=3; i<=NF; i++) print $1, $2, $i}
' file
Perlでは、次のようになります。
perl -F'[,\t]' -lane 'print join "\t", @F[0,1], $F[$_] for 2..$#F' file
# or
perl -F'[,\t]' -slane 'print @F[0,1], $F[$_] for 2..$#F' -- -,=$'\t' file
実際のタブ文字があるかどうかわからない場合:
- 奇妙な:
FS = ",|[[:blank:]]+"
- 真珠:
-F',|\s+'
楽しみとしてbash
while IFS= read -r line; do
prefix=${line%%GO:*}
IFS=, read -ra gos <<< "${line#$prefix}"
for go in "${gos[@]}"; do echo "$prefix$go"; done
done < file
このバージョンはスペースやタブを気にしませんが、たくさんPerlやawkより遅いです。