根据第一列的值对单词进行分组

根据第一列的值对单词进行分组

我想根据第一列的值对所有文件内容进行分组。如果输出是排序的形式会更好。

输入:

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{$_}})),打印与连接字符串对应的每个键。

相关内容