2017-01-03 47 views
0

我想使用sort命令排序我的文本文件數據。 我的數據採用以下格式。日期時間的排序數據在UNIX中使用排序

01-03-17 10:30AM     1367 data_03012017_10_30_02.csv 
01-03-17 11:00AM     32 data_03012017_11_00_02.csv 
01-03-17 11:30AM     7532 data_03012017_11_30_03.csv 
01-03-17 12:00AM     3442 data_03012017_00_00_02.csv 
01-03-17 12:00PM     9715 data_03012017_12_00_03.csv 
01-03-17 12:30AM     1753 data_03012017_00_30_00.csv 
01-03-17 12:30PM     5857 data_03012017_12_30_03.csv 

以上是我的文件數據。請幫我分類這些數據。我正陷入AM & PM數據中。請幫助。使用sort -n -t"," -k1.7,1.10 -k1.1,1.2 -k1.4,1.5命令數據將按日期排序,但不會與AM & PM排序。讓我知道如何做到這一點。

+0

首先,展示你先做了什麼。 「爲我做的工作」鍵入幾乎沒有顯示的職位 - 或者在這種情況下沒有任何努力 - 很少得到迴應,並且經常被忽略和/或低估。 – Takarii

+0

@Takarii添加了命令,但它將適用於時間數據,而不適用於AM和PM –

+1

[在unix中排序日期字段]的可能重複(http://stackoverflow.com/questions/11536368/sorting-date-field-in-unix ) – Zlemini

回答

2

我想您的日期轉換爲更多的東西的標準。

假設你正在使用MM-DD-YY(一種老式的美國會議),你可能會做的POSIX或bash shell中使用BSD date命令如下:

$ while read d t s f; do printf "%s %20d %s\n" "$(date -jf '%m-%d-%y %I:%M%p' "$d $t" '+%F %T')" "$s" "$f"; done < input.txt | sort 
2017-01-03 00:00:43     3442 data_03012017_00_00_02.csv 
2017-01-03 00:30:43     1753 data_03012017_00_30_00.csv 
2017-01-03 10:30:43     1367 data_03012017_10_30_02.csv 
2017-01-03 11:00:43     32 data_03012017_11_00_02.csv 
2017-01-03 11:30:43     7532 data_03012017_11_30_03.csv 
2017-01-03 12:00:43     9715 data_03012017_12_00_03.csv 
2017-01-03 12:30:43     5857 data_03012017_12_30_03.csv 

或者,分開進行更容易閱讀:

while read d t s f; do 
    printf "%s %20d %s\n" \ 
    "$(date -jf '%m-%d-%y %I:%M%p' "$d $t" '+%F %T')" \ 
    "$s" \ 
    "$f" 
done < input.txt | sort 

它使用date命令解釋和重新組裝您的日期,從當前格式轉換成他們的東西,自然排序。請注意,通過這樣做,您可以避免使用sort命令的任何選項。

經過OS X和FreeBSD測試。

3

假設你的數據在unsorted.dat,你可以使用下面的代碼

cat unsorted.dat | while read line ; do 
    d=$(echo "$line" | cut -d" " -f1-2) 
    s=$(echo "$d" | \ 
    sed 's/^\([0-9]*\)-\([0-9]*\)-\([0-9]*\)\(\s.*\)$/\3-\1-\2\4/' | \ 
     xargs -0 date +%s -d) 
    echo "$s $line" 
done | sort -n -k1,1 | cut -d" " -f2- 

它所做的是

  1. 一行
  2. 讀取文件線由前兩個提取日期字段列轉換爲變量$d
  3. 如GNU所識別的,將字段順序從MM-DD-YY更改爲YY-MM-DD date效用
  4. 轉換的日期秒因爲01-01-1970
  5. 的秒數添加到行
  6. 排序的秒數
  7. 剪切含有​​的秒數出第一個字段。

結果:

01-03-17 12:00AM     3442 data_03012017_00_00_02.csv 
01-03-17 12:30AM     1753 data_03012017_00_30_00.csv 
01-03-17 10:30AM     1367 data_03012017_10_30_02.csv 
01-03-17 11:00AM     32 data_03012017_11_00_02.csv 
01-03-17 11:30AM     7532 data_03012017_11_30_03.csv 
01-03-17 12:00PM     9715 data_03012017_12_00_03.csv 
01-03-17 12:30PM     5857 data_03012017_12_30_03.csv 
+1

將日期轉換爲YY-MM-DD形式後,您可以簡單地將它們排序爲字符串,而無需轉換爲秒。 –

+0

@tribble轉換爲yy-mm-dd是不夠的。必須注意am/pm時間的正確順序 –