1

1GBを超える大きなテキストファイルがあります。このファイルには、TABで区切られた4つの列があります。

Col1: Guid
Col2: Date-time (yy-mm-yyyy 0000000000)
Col3: String
Col4: String

その列の1つ以上がソートされているかどうかを判別したい。

それを行う簡単な方法はありますか?たぶんPerlまたはいくつかのUNIXコマンドを使用していますか?または同様のもの?

大規模なサーバーとローカルのWindowsマシンにファイルがあるので、メモリやCPUの速度やOSは問題になりません。

4

4 に答える 4

9

-cのオプションを使用しsortて並べ替え順序を確認し-k、どの列で指定するかを指定します。

$ sort -c -k2,2 file
sort: file:2: disorder: Col2: Date-time (yy-mm-yyyy 0000000000)

または-C、出力を抑制して終了コードをテストします。バージョンソート-nの数値ソートなど、データに応じてソートのタイプを指定することもできます。-v

于 2013-01-15T16:06:06.727 に答える
4

の多くのバージョンにsortは、ファイルがソートされているかどうかをチェックするオプションがあります。たとえば、私のラップトップ (Debian) のバージョンを使用すると、次のことができます。

if sort -C -k 2,2 somefile
then
  # something
else
  # something else
fi

ファイルの 2 列目がソートされているかどうかを確認します。の終了コードは、sort成功または失敗を示します。

于 2013-01-15T16:09:10.653 に答える
3

最初に列を決定し、次に awk を使用します

awk '{print $2}' OFS="\t" test.tmp > unsorted_file.dat

2列目

awk '{print $2}' OFS="\t" test.tmp | sort > sorted_file.dat

diff sorted_file.dat unsorted_file.dat
于 2013-01-15T15:59:29.100 に答える
1

行を列に分割し、前の行の値と比較するだけです。前の値が現在の行の値より大きい場合、列はソートされません。

#! /usr/bin/perl

use strict;
use warnings;

my @sorted = (1, 1, 1, 1);
my $first = <>; # read the first line
my @prev = split(/\t/, $first);

while (<>) {
    my @cols = split(/\t/);
    for (my $i = 0; $i < 4; ++$i) {
        $sorted[$i] = 0 if ($prev[$i] gt $cols[$i]);
    }

    @prev = @cols;
}

for (my $i = 0; $i < 4; ++$i) {
    my $not = $sorted[$i] ? '' : 'not ';
    print "Column $i is $not sorted\n";
}

テストファイル.txt

a   a   a   a
b   b   b   b
c   c   c   c
d   d   d   d
e   e   e   a
f   d   f   f
g   g   g   g

として呼び出す

perl script.pl file.txt

あなたにあげます

列 0 はソートされています
列 1 はソートされていません
列 2 はソートされています
列 3 はソートされていません

これは、テキストを比較し、昇順でテストします。別の順序または別の比較が必要な場合は、それに応じて内側の for ループを調整する必要があります。

于 2013-01-15T16:18:49.280 に答える