web-dev-qa-db-fra.com

Script pour trier le contenu de plusieurs fichiers dans un répertoire

Bonjour, je dois collecter chaque mois l'historique de navigation de certaines personnes, et je suis un noob totalement linux. Je voudrais d’abord sort les sites Web puis exécuter un uniq -u. La sortie du programme que j'utilise ressemble à ceci -

==================================================
URL               : http://example.com/
==================================================
==================================================
URL               : http://example.com/en
==================================================
==================================================

Il y en a environ 30 dans un dossier /history nommé par exemple bob.txt, tim.txt, etc. Est-il possible de créer un script qui trie le contenu de tous les fichiers du répertoire, supprime tous les signes =, supprime les doublons et enregistre le résultat dans un nouveau fichier, par exemple bob.doc, tim.doc?

Pour le moment, je cours manuellement sort bob.txt | uniq -u > bob.doc

3
Bollie

Cela fonctionne, du moins pour l'exemple que vous avez donné:

for i in *.txt; do
  sed '/=/d;s/URL *: //' "$i" |
  sort -u > "${i%%.txt}".doc
done

Des explications

  • for i in *.txt; do … done - boucle sur tous les fichiers .txt du répertoire en cours
  • sed '/=/d;s/URL *: //' - supprime chaque ligne commençant par =, supprime le contenu avant l'URL de chaque ligne
  • sort -u - trie et affiche uniquement le premier d'une exécution égale
  • > "${i%%.txt}".doc - redirige la sortie vers, par exemple, bob.doc pour un fichier d'entrée bob.txt (avec extension des paramètres )
7
dessert

GNU awk (par défaut sous Ubuntu) - seul:

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
            /\w+/{a[$1]} END{for(i in a) print i}' *.txt
  • En supposant que tous les fichiers d'entrée se terminent par .txt; Si ce n'est pas le cas, apportez les modifications nécessaires au motif global *.txt

  • La variable FPAT définit la définition du champ à l’aide de Regex. Nous avons défini la partie des enregistrements commençant par http avec une option optionnelle s, suivie de :, jusqu’à l’espace blanc suivant. champ par le motif Regex https?:[^\\s]+'

  • awk ne prend en charge que les tableaux associatifs qui ne sont pas triés par défaut (bon, triés selon un hachage interne - il s'agit d'un détail d'implémentation), nous définissons l'ordre de tri du tableau a en fonction de l'index. chaînes utilisant le tableau associatif PROCINFO avec la clé sorted_in ayant la valeur @ind_str_asc sur PROCINFO["sorted_in"]="@ind_str_asc". Si vous voulez un ordre décroissant, utilisez PROCINFO["sorted_in"]="@ind_str_desc"

  • Enfin, END{for(i in a) print i} parcourt les éléments du tableau a et affiche les clés de tableau triées.


Si vous souhaitez enregistrer la sortie dans un fichier, par exemple out.txt:

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
            /\w+/{a[$1]} END{for(i in a) print i}' *.txt >out.txt

EDIT:

Si vous souhaitez enregistrer la sortie de chaque fichier en cours de traitement dans un fichier correspondant avec l'extension .txt remplacée par .doc, utilisez awk variable FILENAME pour obtenir le nom du fichier, sub(".txt$", ".doc", FILENAME pour renommer et ENDFILE pour traiter le tableau à la fin de chaque traitement de fichier:

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
           /\w+/{a[$1]} ENDFILE{sub(".txt$", ".doc", FILENAME); \
                  for(i in a) print i > FILENAME}' *.txt
3
heemayl