タブで区切られたデータには4つの列があり、手順2を実行する必要があります。
- 最初の2列の組み合わせに基づいてデータをグループ化します。
- 特定のグループ(col2)の関連付けられた値(col 4)で新しい値の組み合わせが発生するたびに、その行にアルファベット順と数字順に新しいカテゴリを割り当てる必要があります。以前に組み合わせが見つかった場合は、そのカテゴリが指定されます。
入力ファイルは次のとおりです
Line Group Name Value
L1 G1 AX27 A
L1 G1 AX25 T
L1 G1 AX356 G
L1 G2 1X87 C
L1 G2 AX78 A
L1 G2 AX987 A
L1 G2 AX001B A
L1 G3 A2XTR1 A
L1 G3 A2XTR2 T
L2 G1 AX27 A
L2 G1 AX25 T
L2 G1 AX356 C
L2 G2 1X87 G
L2 G2 AX78 T
L2 G2 AX987 A
L2 G2 AX001B A
L2 G3 A2XTR1 A
L2 G3 A2XTR2 T
L3 G1 AX25 T
L3 G1 AX356 G
L3 G2 AX987 A
L3 G2 AX001B A
L3 G3 A2XTR1 A
L3 G3 A2XTR2 C
L4 G1 AX27 A
L4 G1 AX25 T
L4 G1 AX356 G
L4 G3 A2XTR1 A
L4 G3 A2XTR2 C
L5 G3 A2XTR1 A
L5 G3 A2XTR2 T
中間出力ファイルは次のとおりです。
Line Group Collapsednames Collapsedvalues
L1 G1 AX27 AX25 AX356 A T G
L2 G1 AX27 AX25 AX356 A T C
L3 G1 AX25 AX356 T G
L4 G1 AX27 AX25 AX356 A T G
L1 G2 1X87 AX78 AX987 AX001B C A A A
L2 G2 1X87 AX78 AX987 AX001B G T A A
L3 G2 AX987 AX001B A A
L1 G3 A2XTR1 A2XTR2 A T
L2 G3 A2XTR1 A2XTR2 A T
L3 G3 A2XTR1 A2XTR2 A C
L4 G3 A2XTR1 A2XTR2 A C
L5 G3 A2XTR1 A2XTR2 A T
すべての行(L1〜L4)に対して、G1には3つの組み合わせ(ATG、ATC、TG)があり、ここで組み合わせ(ATG)が繰り返されます。したがって、Aが2回表示されるすべての組み合わせに文字カテゴリA、B、Cを割り当てることができます。
最終出力は次のとおりです。
Line Group Collapsednames Collapsedvalues Alpha_Category Number_Category
L1 G1 AX27 AX25 AX356 A T G A 1
L2 G1 AX27 AX25 AX356 A T C B 2
L3 G1 AX25 AX356 T G C 3
L4 G1 AX27 AX25 AX356 A T G A 1
L1 G2 1X87 AX78 AX987 AX001B C A A A A 1
L2 G2 1X87 AX78 AX987 AX001B G T A A B 2
L3 G2 AX987 AX001B A A C 3
L1 G3 A2XTR1 A2XTR2 A T A 1
L2 G3 A2XTR1 A2XTR2 A T A 1
L3 G3 A2XTR1 A2XTR2 A C B 2
L4 G3 A2XTR1 A2XTR2 A C B 2
L5 G3 A2XTR1 A2XTR2 A T A 1
これは試したステップ1ですが、うまくいきませんでした。ステップ1を調べた後、ステップ2をどうするべきかわかりません。
awk -F"\t" '{if(a[$1$2]){a[$1$2]=a[$1$2]" "$3" "$4} else { a[$1$2]=$3"\t$4}} END {for (i in a) {print i"|"a[i]}}' file
答え1
ビューほど簡単ではありません。 Perlソリューションでは、コードを理解しやすくするために、より詳細に説明しようとしました。ネストされたデータ構造(ハッシュハッシュ、配列ハッシュ)に関する基本的な知識が必要です。
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my (%collapsed, %groups);
<>; # Skip header.
while (<>) {
my ($line, $group, $name, $value) = split;
push @{ $collapsed{$line}{$group}{names} }, $name;
push @{ $collapsed{$line}{$group}{values} }, $value;
undef $groups{$group};
}
for my $group (sort keys %groups) {
for my $line (sort keys %collapsed) {
next unless $collapsed{$line}{$group};
my $value = join q(), @{ $collapsed{$line}{$group}{values} };
$groups{$group}{$value} ||= keys %{ $groups{$group} };
}
}
for my $group (sort keys %groups) {
for my $line (sort keys %collapsed) {
next unless $collapsed{$line}{$group};
my $value = join q(), @{ $collapsed{$line}{$group}{values} };
say join "\t", $line, $group,
join(' ', @{ $collapsed{$line}{$group}{names} }),
join(' ', @{ $collapsed{$line}{$group}{values} }),
chr $groups{$group}{$value} - 1 + ord 'A',
$groups{$group}{$value},
}
}
答え2
Awk
解決策(多くの連想配列)しかし:
#!/usr/bin/awk
BEGIN {
SUBSEP=" "
split("A1^B2^C3^D4^E5",c,"^")
}
NR != 1 {
L[$1]=1
G[$2]=1
a[$1,$2]=a[$1,$2]" "$3
b[$1,$2]=b[$1,$2]" "$4
}
END {
for (g in G)
{
i=1
for (l in L)
{
idx=b[l,g]
if(d[idx]=="")
d[idx]=c[i++]
}
}
for (k in a)
print k a[k] b[k],d[b[k]]
}
上記のスクリプトを実行します。
awk -f script.awk tab.data | sort -k2,2 -k1,1
説明が必要な場合は、コメントで質問してください。