<p>我将提供3种解决方案—Awk、Perl和python2。你知道吗</p>
<h3>Awk</h3>
<p>这是一个运行<code>awk</code>的shell脚本:</p>
<pre><code>#!/bin/sh
awk '{ for (i = 2; i <= NF; i++) list[$i] = list[$i] " " $1 }
END { for (i in list) printf "%-7s %s\n", i, list[i] }' "$@"
</code></pre>
<h3>Perl</h3>
<pre><code>#!/usr/bin/env perl
use strict;
use warnings;
my %list = ();
while (<>)
{
my ($chem, @soln) = split;
push @{$list{$_}}, $chem foreach (@soln);
}
for my $key (sort { lc($a) cmp lc($b) } keys %list)
{
printf "%-7s %s\n", $key, join(' ', @{$list{$key}});
}
</code></pre>
<h3>Python2</h3>
<pre><code>#!/usr/bin/env python
import fileinput
list = {}
for line in fileinput.input():
bits = line.split()
for i in range(1, len(bits)):
if bits[i] not in list:
list[bits[i]] = []
list[bits[i]].append(bits[0])
for key in sorted(list.keys(), key = str.lower):
print "%-7s %s" % (key, ' '.join(list[key]))
</code></pre>
<h3>示例输出</h3>
<pre><code>$ sh so.32062773.sh so.32062773.data
NaCl Sol_00000001 Sol_00000002 Sol_00000002 Sol_00000006 Sol_00000009
H2O2 Sol_00000001 Sol_00000004 Sol_00000009
KNMO4 Sol_00000001 Sol_00000005 Sol_00000009
KOCl Sol_00000003 Sol_00000007 Sol_00000009
NHO2 Sol_00000003 Sol_00000003 Sol_00000008 Sol_00000009
$ perl so.32062773.pl so.32062773.data
H2O2 Sol_00000001 Sol_00000004 Sol_00000009
KNMO4 Sol_00000001 Sol_00000005 Sol_00000009
KOCl Sol_00000003 Sol_00000007 Sol_00000009
NaCl Sol_00000001 Sol_00000002 Sol_00000002 Sol_00000006 Sol_00000009
NHO2 Sol_00000003 Sol_00000003 Sol_00000008 Sol_00000009
$ python so.32062773.py so.32062773.data
H2O2 Sol_00000001 Sol_00000004 Sol_00000009
KNMO4 Sol_00000001 Sol_00000005 Sol_00000009
KOCl Sol_00000003 Sol_00000007 Sol_00000009
NaCl Sol_00000001 Sol_00000002 Sol_00000002 Sol_00000006 Sol_00000009
NHO2 Sol_00000003 Sol_00000003 Sol_00000008 Sol_00000009
$
</code></pre>
<p><code>awk</code>不尝试对键进行排序。将输出通过管道传输到<code>sort -f</code>以获得与Perl和Python相同的不区分大小写的排序输出是可行的。你知道吗</p>