2013-01-15 19 views
1

我有1GB以上的大文本文件更大。該文件有4個由TAB分隔的列。如何確定是否在一個大的文本文件的一個或多個列進行排序或不排序

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

我想確定一列或多列是否已排序或未排序。

有沒有快速的方法來做到這一點?也許使用Perl或一些unix命令?還是類似的東西?

我有大型服務器和我的本地Windows計算機上的文件,所以內存或CPU速度或OS是不是一個問題。

+1

排序什麼?整型?話?聽起來像一個棘手的perl/bash/awk單線程。我會用python來做,更易於維護和擴展。 –

+0

是的,你可以寫一個簡短的(<15行,非常粗略的估計)perl腳本來做到這一點,如果這就是你的意思是「快速」。但既然你已經建議perl,我想你知道這件事。 – Khaur

+0

我剛剛更新了問題的列類型細節 – Watt

回答

9

只需使用的sort-c選項來檢查有序和-k指定在其列:

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

-C來抑制輸出並測試退出代碼。您可能還想指定排序類型,具體取決於-n等數據類型-v的版本排序等數據。

+0

感謝您的回答! – Watt

3

首先確定列 然後用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 
4

許多sort版本有一個選項,以檢查文件是否排序或不是。例如,使用我的筆記本電腦上的版本(Debian),我可以這樣做:

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

檢查文件的第二列是否排序。 sort的退出碼錶示成功或失敗。

+0

感謝您的解決方案 – Watt

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"; 
} 

測試file.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循環。

+0

感謝您的解決方案! – Watt

相關問題