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
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
for i in *.txt; do … done
- boucle sur tous les fichiers .txt
du répertoire en courssed '/=/d;s/URL *: //'
- supprime chaque ligne commençant par =
, supprime le contenu avant l'URL de chaque lignesort -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 )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