3

次のサンプルデータを含む入力ファイルがあります。

kernel_version ホスト名

2.6.32-220.el6.x86_64 www01.dc1.domain.com
2.6.32-220.el6.x86_64 www02.dc1.domain.com
2.6.32-220.el6.x86_64 exc01.dc1.domain.com
2.6.32-220.el6.x86_64 exc02.dc1.domain.com
2.6.32-120.el6.x86_64 www03.dc2.domain.com
2.6.32-120.el6.x86_64 www04.dc2.domain.com
2.6.32-120.el6.x86_64 exc03.dc2.domain.com
2.6.32-120.el6.x86_64 exc04.dc2.domain.com
2.6.32-100.el6.x86_64 www05.dc3.domain.com
2.6.32-100.el6.x86_64 www06.dc3.domain.com
2.6.32-100.el6.x86_64 exc05.dc3.domain.com
2.6.32-100.el6.x86_64 exc06.dc3.domain.com
2.6.32-220.el6.x86_64 www07.dc4.domain.com
2.6.32-220.el6.x86_64 www08.dc4.domain.com
2.6.32-220.el6.x86_64 exc07.dc4.domain.com
2.6.32-220.el6.x86_64 exc08.dc4.domain.com

固有のカーネル バージョンと、どの DC がどの DC を実行しているかを出力したいと思います。

例えば;

2.6.32-220.el6.x86_64 dc1, dc4
2.6.32-120.el6.x86_64 dc2
2.6.32-100.el6.x86_64 dc3

これを達成するための最良の方法は何ですか?

4

2 に答える 2

1

私はこのようなことをします:

#!/usr/bin/perl
use warnings;
use strict;

my %kernels;
open INPUT,"<inputfile";

while (<INPUT>)
{
    my ($version, $hostname) = split(/\s+/,$_);
    if ($kernels{$version}) { $kernels{$version} .= ", $hostname" }
    else { $kernels{$version} = $hostname }
}
close INPUT;    

# Print the summary
foreach my $kernel (keys(%kernels)) {   print "$kernel\t$kernels{$kernel}\n"; }

警告:このスクリプトはテストしていません。私は、このコードによって引き起こされる可能性のある構文エラー、競合状態、またはヴェロキラプトル攻撃について責任を負いません..

編集:私は今それをテストしました。1 つの構文エラーが修正され、主要なヴェロキラプトルの攻撃はありません。

于 2012-11-10T00:42:39.290 に答える
1

これはあなたのために働くかもしれません:

sed 's/ [^\.]*\.\([^.]*\).*/ \1/' file |
sort -u |
sed ':a;$!N;s/^\(\(.*\) .*\)\n.*\2/\1,/;ta;P;D'

元の順序で使用するために、これは結果を返しますが、元の順序ではありません。

sed 's/ [^\.]*\.\([^.]*\).*/ \1/' file |
cat -n - |
sort -uk2,3 |
sed ':a;$!N;s/^\(.\{7\}\(.*\) .*\)\n.*\2/\1,/;ta;P;D' |
sort -n | 
sed 's/^.\{7\}//'
于 2012-11-10T09:10:00.873 に答える