Mesclar e classificar vários arquivos com “sort”

4

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

    
por NewbiZ 03.06.2010 / 15:52

4 respostas

4

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 .

    
por 03.06.2010 / 17:23
7

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.

    
por 03.06.2010 / 16:01
2

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
    
por 03.06.2010 / 18:38
0

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.

    
por 03.06.2010 / 16:28

Tags