使用“sort”合并并排序多个文件

使用“sort”合并并排序多个文件

我有一堆以下格式的文本日志文件:

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 只是所有文件的串联,根本没有排序 :(

如果有人能就此问题提供帮助,我将不胜感激!

谢谢

答案1

您的密钥应该是-k1.17n,并且省略-t+17

ID 和时间戳之间有空格吗?那么时间戳就是字段 2,而 key 应该是-k2

答案2

man sort内容如下:

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

我的 sort 手册页中没有显示“+”符号。所以我不知道你如何得到 +17。如果你想使用整行,你可以这样做不是需要-t-k,因为默认是从行首开始排序到行尾。

答案3

我喜欢这些难题……这个问题让我思考:

本质上,它连接所有 .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

答案4

尝试cat首先使用来连接文件,然后对其进行排序。sort不会对多个文件感到困惑,因为它会看到来自 stdin 的单个输入流。

您使用的选项组合-t-k似乎试图在 sort 通常执行的操作之外执行此操作。sort 对具有特定分隔符(默认情况下为空格)的字段进行操作。

您可能需要使用某种组合cut(按字节拆分字段),awk将它们拼接在一起,sort对行进行排序,然后awk以原始格式重新创建行。

相关内容