Sua chave deve ser -k1.17n
e omitir o -t
e o +17
.
Existe um espaço entre o ID e o timestamp? Então o timestamp é o campo 2 e a chave deve ser -k2
.
Eu tenho um monte de arquivos de log de texto no seguinte formato:
ID (17 characters)
Timestamp (14 characters YYYYmmddHHMMSS e.g. "20060210100040" -> 2006/02/10 10:00:40)
Random data (? characters)
end of line
Os arquivos já estão classificados por timestamp. Eu preciso obter um arquivo de log com todos os logs de vários arquivos de registros, classificados por timestamp. Note que os arquivos de log são realmente enormes, cerca de 3-4G cada (e existem dezenas deles) Eu tentei o seguinte comando:
sort -s -m -t '|' -k1n,1n +17 -o data_sort.txt *.TXT
Veja como acabei com este comando:
-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
Na verdade ... falha miseravelmente. O arquivo de saída data_sort.txt é apenas a concatenação de todos os arquivos, não classificados de todo: (
Eu apreciaria muito se alguém pudesse fornecer alguma ajuda sobre este problema!
Obrigado
man sort
lê:
-m, --merge merge already sorted files; do not sort
O símbolo '+' não aparece na minha página de manual para ordenação. Então eu não sei como você recebe +17. Se você quiser usar toda a linha, você não precisa de -t
ou -k
, já que o padrão é começar a classificação do início da linha até o final da linha.
Eu gosto desses difíceis ... esse me fez pensar:
Essencialmente, ele concatena todos os arquivos .txt, separa-os com vírgulas (para ordenação), classifica o segundo campo (o r ordena o mais novo primeiro, retira-o se quiser o último) e depois remove os dois pontos, mostrando a linha original.
cat *.txt
| awk '{print substr($0,1,17)":"substr($0,18,14)":"substr($0,32)}'
| sort -t: -k2,2 -nr -s
| tr -d ':'
Eu testei com três arquivos .txt de 4 linhas.
Primeiro arquivo
1234567890123456720100603104500Random text or data
2345678901234567820100602104500New Random Text
3456789012345678920100509213849Earlier Date
4567890123456789020100521195058InBetween Date
Segundo arquivo
1234567890123456720100603124500File2 Random text or data
2345678901234567820100602124500File2 New Random Text
3456789012345678920100519213849File2 Earlier Date
4567890123456789020100523195058File2 InBetween Date
Terceiro arquivo
12345678901234567201106031045003Random text or data
23456789012345678201004021045003New Random Text
34567890123456789201007092138493Earlier Date
45678901234567890201005231950583InBetween Date
Resultados
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
Tente usar cat
primeiro para concatenar os arquivos e depois classificar isso. sort
não será confundido com vários arquivos porque verá um único fluxo de entrada proveniente de stdin.
A combinação de opções que você está usando para -t
e -k
parece que você está tentando fazer isso fora do que normalmente faz. A classificação funciona em campos com delimitadores específicos - espaço em branco por padrão.
Você provavelmente desejará usar uma combinação de cut
(para dividir campos por byte), awk
para uni-los, sort
para classificar as linhas e, em seguida, awk
para recriar as linhas em o formato original.