次の表があります。
DAPPUDRAFT_194440 Phosphorous
DAPPUDRAFT_194440 Temperature
DAPPUDRAFT_194472 Phosphorous Fishkairomones
DAPPUDRAFT_194472 Temperature
DAPPUDRAFT_194512 Fishkairomones
DAPPUDRAFT_194512 Cadmium Zinc Quantumdots
DAPPUDRAFT_195644 Salinity
DAPPUDRAFT_195644 Phosphorous
DAPPUDRAFT_196131 Salinity
DAPPUDRAFT_196131 Phosphorous
DAPPUDRAFT_196131 hypoxia
DAPPUDRAFT_196694 Salinity
ご覧のとおり、さまざまな数の列(タブ区切り)にデータを含めることができます。
「DAPPUDRAFT_」で始まる最初の列の重複エントリは削除する必要があり、複数行に表示される他のすべての値は単一行に表示される必要があります。
たとえば、私の入力テーブルでは、「DAPPUDRAFT_194440」はテーブルに2回表示されます。ここで、データサブセットに示すように、1行には「Temperature」、2行目には「Phosphorus」という2つの値があります。
DAPPUDRAFT_194440 Phosphorous
DAPPUDRAFT_194440 Temperature
私が見たいのは、「DAPPUDRAFT_」が一度だけ表示され、「Temperature」と「Phosphorus」の2つの項目が次のようにタブで区切られ、同じ行に表示されなければならないということです。
DAPPUDRAFT_194440 Phosphorous Temperature
予想出力:
DAPPUDRAFT_194440 Phosphorous Temperature
DAPPUDRAFT_194472 Phosphorous Fishkairomones Temperature
DAPPUDRAFT_194512 Fishkairomones Cadmium Zinc Quantumdots
DAPPUDRAFT_195644 Salinity Phosphorous
DAPPUDRAFT_196694 Salinity
DAPPUDRAFT_196131 Salinity Phosphorous hypoxia
Rで「reshape2」パッケージとdcast機能を試してみました。しかし、それは私が望むものとはまったく異なることをします。コマンドライン、R、またはPerlでこの問題を解決するのに役立つ方法はありますか?
答え1
簡単にアッ:
awk '{ r=$0; sub($1,"",r); a[$1]=(a[$1])? a[$1]"\t"r : r }
END{ for(i in a) { gsub(/[[:space:]]{2,}/," ",a[i]); print i,a[i] } }' file
r=$0
- 記録のコピーをキャプチャします。sub($1,"",r)
- コピーの最初のフィールドを削除して、残りのフィールドをr
変数に保存します。a[$1]=(a[$1])? a[$1]"\t"r : r
- 同じ価値を築くグループ(セッション1で提案)for(i in a)
- グループ化されたすべての項目を繰り返します。gsub(/[[:space:]]{2,}/," ",a[i])
- 単語の間に不要なスペースを削除します。print i,a[i]
- グループ名と値の印刷
出力:
DAPPUDRAFT_194440 Phosphorous Temperature
DAPPUDRAFT_196694 Salinity
DAPPUDRAFT_194512 Fishkairomones Cadmium Zinc Quantumdots
DAPPUDRAFT_194472 Phosphorous Fishkairomones Temperature
DAPPUDRAFT_196131 Salinity Phosphorous hypoxia
DAPPUDRAFT_195644 Salinity Phosphorous
答え2
または
$ perl -e 'while(<ARGV>){chomp;($x,$y)=split(/\s+/,$_,2);$hash{$x}.=$y;}for(keys %hash){print "$_ $hash{$_}\n";}' test1
DAPPUDRAFT_196694 Salinity
DAPPUDRAFT_194440 Phosphorous Temperature
DAPPUDRAFT_195644 Salinity Phosphorous
DAPPUDRAFT_194472 Phosphorous Fishkairomones Temperature
DAPPUDRAFT_194512 Fishkairomones Cadmium Zinc Quantumdots
DAPPUDRAFT_196131 Salinity Phosphorous hypoxia
答え3
行と要素の並べ替え方法に興味がない場合は、次の操作を行います。
sed 'G;s/^\(.*\)\(\t.*\)\n\(.*\)\1/\3\1\2/;h;$!d;s/\n$//' file
GNUでない場合は、文字通りTABにsed
置き換えられます。\t