Câu hỏi Hợp nhất và sắp xếp nhiều tệp với "sắp xếp"


Tôi có một loạt các tệp nhật ký văn bản theo định dạng sau:

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

Các tệp đã được sắp xếp theo dấu thời gian. Tôi cần nhận 1 tệp nhật ký với tất cả nhật ký từ nhiều tệp nhật ký, được sắp xếp theo dấu thời gian. Lưu ý rằng các tệp nhật ký thực sự rất lớn, khoảng 3-4G mỗi tệp (và có hàng tá tệp) Tôi đã thử lệnh sau:

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

Đây là cách tôi đã kết thúc với lệnh này:

-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

Trên thực tế ... nó thất bại thảm hại. Tệp dữ liệu đầu ra data_sort.txt chỉ là kết nối của tất cả các tệp, không được sắp xếp ở tất cả :(

Tôi sẽ đánh giá rất cao nếu có ai có thể giúp đỡ về vấn đề này!

Cảm ơn


4
2018-06-03 13:52


gốc


Bất kỳ câu trả lời nào cho thấy việc ghép các tập tin đầu tiên rõ ràng đã không tính đến thực tế là kích thước của chúng được đưa ra trong GB. - OrangeDog


Các câu trả lời:


Chìa khóa của bạn nên là -k1.17n và bỏ qua -t và +17.

Có một khoảng trống giữa ID và dấu thời gian không? Sau đó, dấu thời gian là trường 2 và khóa phải là -k2.


4
2018-06-03 15:23



Vấn đề là có thể có một khoảng trống trong ID, vì vậy dấu thời gian có thể là trường 1 hoặc trường 2, đó là lý do tại sao tôi cố sửa nó thành trường 1 bằng -t '|' lừa :/ - NewbiZ
@NewbiZ: Sau đó -k1.17n nên làm việc. - Dennis Williamson


man sort lần đọc:

-m, --merge   hợp nhất các tệp đã sắp xếp; không sắp xếp

Biểu tượng '+' không hiển thị trong trang người đàn ông của tôi để sắp xếp. Vì vậy, tôi không biết làm thế nào bạn nhận được +17. Nếu bạn muốn sử dụng toàn bộ dòng, bạn làm không phải nhu cầu -t hoặc là -k, vì mặc định là bắt đầu sắp xếp từ đầu dòng, đến cuối dòng.


7
2018-06-03 14:01



-m là một chút mơ hồ info coreutils sort tiểu bang: Hợp nhất các tệp đã cho bằng cách sắp xếp chúng thành một nhóm. Mỗi tệp đầu vào phải luôn được sắp xếp riêng lẻ. Một ý nghĩ nó sẽ hợp nhất và sắp xếp các tập tin được sắp xếp cục bộ. '+' cũng không hiển thị trong người của tôi, nhưng tôi đã thấy mọi người sử dụng trên một số trang web và tôi không tìm thấy bất kỳ cách nào khác để chỉ định dấu thời gian trong dòng - NewbiZ


Tôi thích những cái khó ... cái này khiến tôi suy nghĩ:

Về cơ bản, nó liên kết tất cả các tệp .txt, phân tách chúng bằng dấu hai chấm (để sắp xếp), sắp xếp trường thứ hai (loại r mới nhất trước tiên, lấy nó ra nếu bạn muốn mới nhất), và sau đó loại bỏ dấu hai chấm, hiển thị dòng gốc .

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

Tôi đã thử nghiệm nó với ba tệp .txt 4 dòng.

Tệp đầu tiên

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

Tệp thứ hai

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

Tệp thứ ba

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

Các kết quả

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

1
2018-06-03 16:38





Thử sử dụng cat đầu tiên ghép các tệp và sau đó sắp xếp tệp đó. sort sẽ không bị nhầm lẫn về nhiều tệp vì nó sẽ thấy một luồng đầu vào đơn lẻ đến từ stdin.

Kết hợp các tùy chọn bạn đang sử dụng cho -t và -k có vẻ như bạn đang cố gắng làm điều này bên ngoài những gì sắp xếp thường. Sắp xếp hoạt động trên các trường có dấu phân cách cụ thể - khoảng trắng theo mặc định.

Có thể bạn sẽ muốn sử dụng một số kết hợp cut (để chia nhỏ các trường theo byte), awk để ghép chúng lại với nhau, sort để sắp xếp các dòng và sau đó awk để tạo lại các dòng ở định dạng ban đầu của chúng.


0
2018-06-03 14:28