我想根据第一列的值对所有文件内容进行分组。如果输出是排序的形式会更好。
输入:
1 foo
2 bar
1 foobar
2 barbar
3 apple
4 banana
3 mango
5 orange
预期输出:
1 foo, foobar
2 bar, barbar
3 apple, mango
4 banana
5 orange
答案1
如果我理解正确的话,你正在寻找
perl -lane 'push @{$k{$F[0]}},$F[1];
END{$"=", ";print "$_ @{$k{$_}}" for sort keys(%k)}' file
没有理由显式地分割线,该-a
标志已经为您完成了。它将每个输入行拆分到@F
数组中。因此,这里我们创建一个%k
哈希,其键是第一个字段,其值是第二个字段的相应列表。然后,最后,我们对哈希键进行排序,将列表分隔符 ( $"
) 设置为,[space]
并打印每个键及其相应的值列表。
答案2
其他perl
:
$ perl -anle '
push @{$h{$F[0]}}, $F[1];
END {
for (sort {$a <=> $b} keys %h) {
print "$_ ", join(", ", @{$h{$_}});
}
}
' file
1 foo, foobar
2 bar, barbar
3 apple, mango
4 banana
5 orange
解释
我们创建一个哈希
$h
,其中的键是值$F[0]
。每个哈希值都是一个数组引用。处理每一行时,我们将第二个字段的值添加$F[1]
到数组引用中push @{$h{$F[0]}}, $F[1]
。$h
处理完所有行后,我们对( )的键进行排序sort {$a <=> $b} keys %h
,将每个数组引用连接到一个字符串 (join(", ", @{$h{$_}})
),打印与连接字符串对应的每个键。