題 使用“排序”合併和排序多個文件


我有一堆文本日誌文件,格式如下:

ID          (17 characters)
Timestamp   (14 characters YYYYmmddHHMMSS e.g. "20060210100040" -> 2006/02/10 10:00:40)
Random data (? characters)
end of line

文件已按時間戳排序。 我需要獲取1個日誌文件,其中包含來自多個日誌文件的所有日誌,按時間戳排序。請注意,日誌文件非常龐大,每個大約3-4G(並且有幾十個) 我嘗試了以下命令:

sort -s -m -t '|' -k1n,1n +17 -o data_sort.txt *.TXT

以下是我最終使用此命令的方法:

-s     : don't bother with tie results
-m     : merge all logs files
-t '|' : there is no | in my logs, so the whole line should be field 1
-k1n,1n: sort on the first field as a numeric value
+17    : the timestamp starts at index 17
-o     : output file

實際上......它失敗了。輸出文件data_sort.txt只是所有文件的串聯,根本沒有排序:(

如果有人能就此問題提供任何幫助,我將不勝感激!

謝謝


4
2018-06-03 13:52


起源


任何建議首先明確連接文件的答案都沒有考慮到它們的大小以GB為單位的事實。 - OrangeDog


答案:


你的鑰匙應該是 -k1.17n 並省略 -t 和 +17

ID和時間戳之間是否有空格?然後時間戳是字段2,鍵應該是 -k2


4
2018-06-03 15:23



問題是ID中可能有空格,因此時間戳可以是字段1或字段2,這就是為什麼我嘗試將其修復為字段1 -t '|' 技巧:/ - NewbiZ
@NewbiZ:然後 -k1.17n 應該管用。 - Dennis Williamson


man sort 內容如下:

-m, - merge   合併已排序的文件; 不要排序

“+”符號未顯示在我的手冊頁中以進行排序。所以我不知道你怎麼得+17。如果你想使用整行,你可以  需要 -t 要么 -k,因為默認是從行的開頭到行尾開始排序。


7
2018-06-03 14:01



-m有點含糊不清 info coreutils sort states:通過將給定文件排序為一組來合併它們。每個輸入文件必須始終單獨排序。一想到它會合併和排序本地排序的文件。 “+”也沒出現在我的男人身上,但我看到有人在某些網頁上使用,我沒有找到任何其他方式來指定行中的時間戳在哪裡 - NewbiZ


我喜歡這些艱難的......這個讓我思考:

基本上,它連接所有.txt文件,用冒號分隔它們(用於排序),對第二個字段進行排序(r先排序最新,如果你想要最新的最後一個取出它),然後刪除冒號,顯示原始行。

cat *.txt
 | awk '{print substr($0,1,17)":"substr($0,18,14)":"substr($0,32)}'
 | sort -t: -k2,2 -nr -s
 | tr -d ':'

我用三個4行.txt文件測試了它。

第一個文件

1234567890123456720100603104500Random text or data
2345678901234567820100602104500New Random Text
3456789012345678920100509213849Earlier Date
4567890123456789020100521195058InBetween Date

第二檔

1234567890123456720100603124500File2 Random text or data
2345678901234567820100602124500File2 New Random Text
3456789012345678920100519213849File2 Earlier Date
4567890123456789020100523195058File2 InBetween Date

第三檔

12345678901234567201106031045003Random text or data
23456789012345678201004021045003New Random Text
34567890123456789201007092138493Earlier Date
45678901234567890201005231950583InBetween Date

結果

12345678901234567201106031045003Random text or data
34567890123456789201007092138493Earlier Date
1234567890123456720100603124500File2 Random text or data
1234567890123456720100603104500Random text or data
2345678901234567820100602124500File2 New Random Text
2345678901234567820100602104500New Random Text
4567890123456789020100523195058File2 InBetween Date
45678901234567890201005231950583InBetween Date
4567890123456789020100521195058InBetween Date
3456789012345678920100519213849File2 Earlier Date
3456789012345678920100509213849Earlier Date
23456789012345678201004021045003New Random Text

2
2018-06-03 16:38





嘗試使用 cat 首先連接文件,然後對其進行排序。 sort 不會混淆多個文件,因為它會看到來自stdin的單個輸入流。

您正在使用的選項組合 -t 和 -k 看起來你正試圖在通常的事情之外做這件事。 Sort對具有特定分隔符的字段進行操作 - 默認情況下為空格。

你可能想要使用一些組合 cut (按字節分隔字段), awk 將它們拼接在一起, sort 然後對行進行排序 awk 以原始格式重新創建行。


0
2018-06-03 14:28