File1 看起来像这样(代谢途径:基因):
A:1
A:2
A:3
B:a
B:b
C:pp
D:rr
如何获取如下所示的输出文件(名为 File1.new):
A:1, 2, 3
B:a, b
C:pp
D:rr
我是一名 Linux 初学者。最好有简单的解释!
答案1
这是 awk 的工作。
awk -F: '{L[$1]=L[$1] "," $2}
END { for (l in L) printf "%s:%s\n",l,substr(L[l],2);}'
在哪里
-F:
用作:
分隔符{L[$1]=L[$1] "," $2}
存储由字段 1 索引的逗号分隔值END
在文件末尾for (l in L)
循环遍历值printf "%s:%s\n",l,substr(L[l],2);
打印,跳过第一个逗号- 您可以使用
","
或", "
,相应地调整最终的子字符串。
awk 可以是单行的,使用
awk -F: '....' File1 > File3
要对基因进行计数,只需添加一个 var tou count(此处为 G)。
{L[$1]=L[$1] "," $2;G[$1]++}
END { for (l in L) printf "%s:%s:%d\n",l,substr(L[l],2),G[l];}
答案2
datamash -t: groupby 1 collapse 2 < file
A:1,2,3
B:a,b
C:pp
D:rr
如果你也想要计数,
datamash -t: groupby 1 collapse 2 count 2 < file
A:1,2,3:3
B:a,b:2
C:pp:1
D:rr:1
countunique
如果您想要唯一字段的数量,您也可以。
答案3
数据结构
%h = (
...
B => [a, b],
A => [1, 2, 3],
...
);
perl -F':' -lane '
push @{$h{$F[0]}}, $F[1]}{
$"=",";
print "$_:", "@{$h{$_}}|", scalar @{$h{$_}} for keys %h;
' File1 > File1.new
简短的
The field separator is set to a semicolon, thus populating each time a line is read in afresh
the @F array. Then we append the 2nd field, $F[1], to the array of hash
keyed in on the 1st field, $F[0]. At the end, we display the key name,
followed by the array contents corresponding to this key, & the count of
the array as well.
输出
A:1,2,3|3
B:a,b|2
C:pp|1
D:rr|1
塞德
sed -e '
:loop
$!N
s/^\(\([^:]*\):.*\)\n\2:\(.*\)/\1,\3/
tloop
P;D
' yourfile