Perl 如何确定大型文本文件中的一列或多列是否已排序

Perl 如何确定大型文本文件中的一列或多列是否已排序,perl,bash,unix,cmd,Perl,Bash,Unix,Cmd,我有超过1GB的大文本文件。该文件有4列,由制表符分隔 Col1: Guid Col2: Date-time (yy-mm-yyyy 0000000000) Col3: String Col4: String 我想确定它的一个或多个列是否已排序 #! /usr/bin/perl use strict; use warnings; my @sorted = (1, 1, 1, 1); my $first = <>; # read the first line my @prev =

我有超过1GB的大文本文件。该文件有4列,由制表符分隔

Col1: Guid
Col2: Date-time (yy-mm-yyyy 0000000000)
Col3: String
Col4: String
我想确定它的一个或多个列是否已排序

#! /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";
}
有什么快速的方法吗?可能使用Perl或某些unix命令?或者类似的东西

我在大型服务器和本地windows计算机上有文件,因此内存、cpu速度或操作系统不是问题。

首先确定列 然后使用awk

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

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

diff sorted_file.dat unsorted_file.dat
首先确定列 然后使用awk

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

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

diff sorted_file.dat unsorted_file.dat

只需使用排序的
-c
选项检查排序顺序,并使用
-k
指定列:

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

-C
以抑制输出并测试退出代码。您可能还需要根据数据指定排序类型,如数值排序的
-n
,版本排序的
-v
,等等

只需使用
sort
-c
选项检查排序顺序,并使用
-k
指定在哪个列上:

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

-C
以抑制输出并测试退出代码。您可能还需要根据数据指定排序类型,如数值排序的
-n
,版本排序的
-v
,等等

许多版本的
sort
都有一个选项来检查文件是否已排序。例如,使用笔记本电脑上的版本(Debian),我可以做到:

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

检查文件的第二列是否已排序。
sort
的退出代码表示成功或失败。

许多版本的
sort
都有一个选项来检查文件是否已排序。例如,使用笔记本电脑上的版本(Debian),我可以做到:

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

检查文件的第二列是否已排序。排序的退出代码表示成功或失败。

只需将行拆分为列,并将它们与前一行中的值进行比较。如果上一个值大于当前行中的值,则该列不会排序

#! /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";
}
称为

perl script.pl file.txt
我会给你

列0已排序
列1未排序
第2列已排序
第3列未排序


这会比较文本和测试的升序。如果需要其他顺序或不同的比较,则必须相应地调整内部for循环。

只需将行拆分为列,并将它们与前一行中的值进行比较。如果上一个值大于当前行中的值,则该列不会排序

#! /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";
}
称为

perl script.pl file.txt
我会给你

列0已排序
列1未排序
第2列已排序
第3列未排序


这会比较文本和测试的升序。如果需要另一个顺序或不同的比较,则必须相应地调整内部for循环。

排序什么?整数?话?听起来像是一个棘手的perl/bash/awk单行程序。我会用python,更易于维护和扩展(我刚刚用列类型detailsNermind更新了这个问题,@Satish解决方案很棒,就用这个吧。可以试着用mktemp把它放到一个脚本中保存未排序的_file.dat。排序什么?整数?单词?听起来像是一个棘手的perl/bash/awk单行程序。我会用python来做,更易于维护和扩展。是的,你可以编写一个简短的(我刚刚用列类型detailsNermind更新了这个问题,@Satish solution很棒,就用这个吧。可以试着把它放在一个脚本中,用mktemp保存未排序的_file.dat。感谢有示例的解决方案!感谢有示例的解决方案!