Question Fusion et tri de plusieurs fichiers avec "tri"


J'ai un tas de fichiers journaux au 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 horodatage. Je dois obtenir 1 fichier journal avec tous les journaux de plusieurs fichiers journaux, triés par horodatage. Notez que les fichiers journaux sont vraiment énormes, environ 3-4G chacun (et il y en a des dizaines) J'ai essayé la commande suivante:

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

Voici comment je me suis retrouvé avec 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 ... ça é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 si quelqu'un pouvait apporter une aide sur ce problème!

Merci


4
2018-06-03 13:52


origine


Toute réponse suggérant de concaténer les fichiers en premier n'a clairement pas tenu compte du fait que leurs tailles sont données en Go. - OrangeDog


Réponses:


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

Y a-t-il un espace entre l'ID et l'horodatage? Ensuite, l’horodatage est le champ 2 et la clé doit être -k2.


4
2018-06-03 15:23



Le problème est qu’il peut y avoir un espace dans l’ID, donc l’horodatage pourrait être le champ 1 ou le champ 2, c’est pourquoi j’ai essayé de le fixer au champ 1 avec le -t '|' tour :/ - NewbiZ
@NewbiZ: Alors -k1.17n devrait marcher. - Dennis Williamson


man sort lit:

-m, --merge   fusionner des fichiers déjà triés; ne pas trier

Le symbole '+' ne s'affiche pas dans ma page de manuel pour le tri. Donc, je ne sais pas comment vous obtenez +17. Si vous voulez utiliser toute la ligne, vous le faites ne pas avoir besoin -t ou -k, puisque la valeur par défaut est de commencer le tri du début de la ligne à la fin de la ligne.


7
2018-06-03 14:01



-m est un peu ambigu info coreutils sort États: Fusionnez les fichiers donnés en les triant en tant que groupe. Chaque fichier d'entrée doit toujours être trié individuellement. A pensé que cela fusionnerait et trierait les fichiers triés localement. '+' n'apparaît pas dans mon personnage aussi, mais j'ai vu des gens utiliser certaines pages Web, et je n'ai trouvé aucun autre moyen de spécifier où est l'horodatage dans la ligne - NewbiZ


J'aime ces durs ... celui-ci m'a fait réfléchir:

Essentiellement, il concatène tous les fichiers .txt, les sépare en deux points (pour le tri), trie le second champ (le premier trie en premier, le sort en dernier), puis supprime les deux-points, en indiquant 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 à 4 lignes.

Premier fichier

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

Deuxième fichier

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

Troisième fichier

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

1
2018-06-03 16:38





Essayez d'utiliser cat tout d'abord pour concaténer les fichiers et ensuite trier. sort ne sera pas confus à propos de plusieurs fichiers, car il verra un seul flux d'entrée provenant de stdin.

La combinaison des options que vous utilisez pour -t et -k On dirait que vous essayez de faire cela en dehors de ce que fait habituellement. Sort opère sur des champs avec des délimiteurs spécifiques - les espaces par défaut.

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


0
2018-06-03 14:28