11 votes

Fusionner et trier plusieurs fichiers avec "sort" (tri)

J'ai un certain nombre de fichiers journaux au format texte dans le format suivant :

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

Les fichiers sont déjà triés par date. J'ai besoin d'obtenir un fichier journal contenant tous les journaux provenant de plusieurs fichiers journaux, triés par date. Notez que les fichiers de logs sont vraiment énormes, environ 3-4G chacun (et il y en a des douzaines). J'ai essayé la commande suivante :

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

Voici comment j'ai obtenu cette commande :

-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

En fait, il échoue lamentablement. Le fichier de sortie data_sort.txt est juste la concaténation de tous les fichiers, pas triés du tout :(

J'apprécierais beaucoup que quelqu'un puisse m'aider à résoudre ce problème !

Remerciements

11voto

akauppi Points 3125

man sort lire :

- fusionne les fichiers déjà triés ; ne pas trier

Le symbole '+' n'apparaît pas dans ma page man pour sort. Je ne sais donc pas comment vous obtenez +17. Si vous voulez utiliser la ligne entière, vous faites pas besoin -t o -k puisque le tri est effectué par défaut du début de la ligne jusqu'à la fin de la ligne.

6voto

Damian Powell Points 315

Votre clé doit être -k1.17n et omettre le -t et le +17 .

Y a-t-il un espace entre l'identifiant et l'horodatage ? Dans ce cas, l'horodatage est le champ 2 et la clé devrait être -k2 .

2voto

Theo Points 1602

J'aime ces questions difficiles... celle-ci m'a fait réfléchir :

Essentiellement, il concatène tous les fichiers .txt, les sépare par des deux-points (pour le tri), trie le deuxième champ (le r trie le plus récent en premier, retirez-le si vous voulez le plus récent en dernier), puis supprime les deux-points, affichant la ligne d'origine.

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

Je l'ai testé avec trois fichiers .txt de 4 lignes.

Premier dossier

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

Deuxième dossier

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

Troisième dossier

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

Résultats

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

0voto

Keith Sirmons Points 2558

Essayez d'utiliser cat d'abord pour concaténer les fichiers et ensuite pour les trier. sort ne sera pas perturbé par la présence de plusieurs fichiers, car il ne verra qu'un seul flux d'entrée provenant de stdin.

La combinaison d'options que vous utilisez pour -t y -k Il semble que vous essayez de faire cela en dehors de ce que fait habituellement le tri. Le tri opère sur des champs avec des délimiteurs spécifiques -- l'espace blanc par défaut.

Vous voudrez probablement utiliser une combinaison de cut (pour découper les champs par octet), awk pour les raccorder, sort pour trier les lignes, puis awk pour recréer les lignes dans leur format d'origine.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X