2014-07-07 218 views
0

我有一個非常大的文件(7G),我想從中提取特定日期列的最小值和最大值(它是文件中的第4列)。 目前,我有這個片段,但我不知道它是多麼有效,而env。林工作是繁重處理敏感,因此,如果任何人都可以想出一些不表現costy,我會很感激的Linux獲取最小/最大日期列

MIN=`date --date="$1" +%s` 
MAX=`date --date="$2" +%s` 

while true ; do 
read LINE 
if [ "$LINE" = "" ] ; then break ; fi 

L_DATE=`echo $LINE | awk '{print $1 " " $2 " " $3 " " $4}'` 
L_DATE=`date --date="$L_DATE" +%s` 

if (($MIN > $L_DATE )) ; then continue ; fi 
if (($L_DATE <= $MAX)) ; then echo $LINE ; fi 
if (($L_DATE > $MAX)) ; then break ; fi 

+0

讀取文件wuth shell'read'並用awk處理每一行?是不是有違法的法律? –

回答

0

對於我經常使用下面的解決方案:

sed 1d textfile | awk '{ if($4 > MAX) { MAX=$4} if(($4 < MIN) || MIN =="") {MIN = $4}} END{print MIN"|"MAX }' FS=";" 

SED 1D將刪除頁眉(除去一部分,如果它並不適用於您的情況)。 也相應地更改FS(字段分隔符)。

+0

非常好,謝謝! – user3628777

+0

在一個8.4 GB的文件上花了大約4分鐘,awk使用了大約60%的CPU,sed 30%(使用top進行監控)。 我做了一個文件的副本並刪除了頭文件,因此只能使用awk語句,然後它仍然需要大約4分鐘,awk將再次佔用60%的CPU。 – Kokkie

0

您正在運行新工藝(AWK,再次日期和bash )爲文件的每一行。我認爲這對效率來說很差。

我會建議使用一些更高級的編程語言來完成像這樣的任務而不是bash。

否則,如果你堅持使用bash,你可以嘗試不使用awk和日期。你的線條的格式是什麼?我想你可以在不轉換它們的情況下比較日期,並且可以用$ {L_DATE // ...}來替換awk命令。

否則,您可以嘗試使用awk來分析整個文件。 。

+0

這是格式2014-05-05 17:30:59.000 – user3628777

+0

所以字符串比較應該可以比較日期。我認爲你不需要調用awk或日期。 –