1

形式、名前、年齢が次のようなタブ区切りのテキストファイルがあります。

chris     19
bobby     29
doofus    67

テキスト ファイルを取り込み、2 番目のフィールドで並べ替えたいと考えていました。テキストファイルを取り込んでデータをフォーマットすることはできますが、正しく並べ替えることができないため、持っていた並べ替えコードを削除しました...

これが簡単なファイルのプルです: どうすれば変更できますか?

open (FILEHERE, 'ages.txt');
while (<FILEHERE>) {
chomp;
my($n, $s) = split("\t");
print "$a\t $s";
}
close (FILEHERE);
4

4 に答える 4

4

ここでは、シュワルツ変換(ST) が役立ちます。

use strict;
use warnings;

my $data = <<END;
chris     19
doofus    67
bobby     29
END

open my $fh, '<', \$data or die $!;

print map $_->[0],
sort { $a->[1] <=> $b->[1] }
map { [ $_, /(\d+)$/ ] }
<$fh>;

close $fh;

出力:

chris     19
bobby     29
doofus    67

ST の一番下から読んでください。このルーチンはファイル行を受け取り、mapその行を無名配列の最初の要素として配置します。2 番目の要素は、2 番目の列からキャプチャされた数値です。はsort匿名サブルーチンを使用して、匿名配列の 2 番目の要素を並べ替えます (したがって、逆参照矢印演算子$a->[1])。ソートされた行にアクセスするために結果が渡されmap、最終的に出力されます。

お役に立てれば!

于 2012-11-20T18:15:09.373 に答える
1

Perlで列ごとに配列またはテーブルをソートする方法からのこの1つのライナー? 動作するはずです:

perl -anE 'push @t,[@F]}{ say "@$_" for sort {$a->[1] <=> $b->[1]} @t' names.txt

@reo katoa と同様に、配列の配列を使用しますが-a、行を@F最初に自動分割するために活用します。自動分割の詳細については、を参照perlrunしてください。

于 2014-11-25T20:47:27.410 に答える
1

ファイルを配列参照の配列に読み込み、各配列の 2 番目のフィールドに基づいて並べ替えることができます。

my @lines;
open (FILEHERE, 'ages.txt');
while(<FILEHERE>) {
    push @lines, [split /\t/];
}

my @sorted = sort { $b->[1] <=> $a->[1] } @lines;

または、データが適切にソートされていることを前提として Perl スクリプトを作成し、stdin から読み取る方が簡単かもしれません。sort -grk2 ages.txt | perl yourscript.pl

于 2012-11-20T18:11:59.663 に答える
0

また、perl を呼び出しsort -k 2,2て 2 番目のフィールドでファイルをソートすることもできます。もちろん-n、それらが数字の場合は使用-rし、逆ソートを実行します。

次のワンライナーを使用してイカのアクセスログを表示すると、最長のセッションが一番上に表示されます

sort -rn -k 2,2 access.log | perl -lpe 's/^([0-9]{10})(.\d{3})/scalar localtime$1/e'
于 2014-01-02T05:40:17.937 に答える