J'essaie de récupérer des données sur Twitter. Je suis capable de lire chaque ligne, mais je ne sais pas quelles commandes utiliser pour filtrer les données comme je le veux. Aucune suggestion.
Fichier d'entrée: fichier.txt
id,created_at,text
842433,2017-05-20 14:45:05,goldring.com was just registered https://t.co/xt9345d
336353,2017-05-20 14:45:04,stretch.com was just registered https://t.co/QBEX965hf
84244e,2017-05-20 14:45:03,"Auctions were started for wantit1.com, wantit2.com, wantit3.com and wantit4.com"
842434,2017-05-20 14:45:02,"Auctions were started for sidefun.com, coffeetec.com, lifeout.com and new-fun-boys.com"
Sortie attendue:
wantit1
wantit2
wantit3
wantit4
sidefun
coffeetec
lifeout
new-fun-boys
Code j'ai:
cat file.txt | while read line;
do
echo "$line" >> out1.txt
done
Pour votre entrée spécifique cela fonctionnera:
grep -Po '\s[a-z1-9-]{2,}(?=\..{2,4})' file.txt
-P
: nous permet d'utiliser l'avenir.-o
: affiche uniquement les matchs.\s
: ne cherche que ceux qui commencent par un espace[a-z1-9-]{2,}
Suivi de tout caractère alphanumérique ou trait d'union, au moins 2 ou plus.(?=\..{3})
: qui se terminera par un point et 2 à 4 caractères (suffixe de domaine) mais ne l'incluez pas.Voici la sortie:
wantit1
wantit2
wantit3
wantit4
sidefun
coffeetec
lifeout
new-fun-boys
Une meilleure idée (basée sur votre commentaire) est d'utiliser:
awk '(/2017-05-20/ && /Auctions were started/)' file.txt | grep -Po '\s[a-z1-9-]{1,}(?=\..{2,4})'
Voici quelques options.
Approche KISS utilisant deux greps:
$ grep 'Auctions were started for' file | grep -o '\S*\.com'
wantit1.com
wantit2.com
wantit3.com
wantit4.com
sidefun.com
coffeetec.com
lifeout.com
new-fun-boys.com
Plus élégant:
$ Perl -lne 'if (/"Auctions were started for (.*)"/) {print for split(/, | and /, $1)}' file
wantit1.com
wantit2.com
wantit3.com
wantit4.com
sidefun.com
coffeetec.com
lifeout.com
new-fun-boys.com
Vous pouvez facilement y parvenir avec une combinaison de grep
pour rechercher toutes les lignes dans file.txt
contenant le texte "Les enchères ont été commencées pour" et de sed
pour extraire uniquement les noms de domaine sans TLD et les imprimer. un par ligne:
grep -Po '(?<="Auctions were started for ).*(?=")' file.txt | sed -r 's/and |,|.com//g;y/ /\n/'
Voici une ventilation de la commande:
grep -Po '(?<="Auctions were started for ).*(?=")' file.txt
Ceci scanne file.txt
ligne par ligne et correspond à tout ce qui est (.*
) précédé de la chaîne "Auctions were started for
et suivi d'un autre "
. Nous avons besoin de l'option -P
de grep
pour activer les expressions régulières PCRE (sinon, nous ne pourrions pas utiliser les recherches (?<=...)
et (?=...)
regex) et son option -o
pour imprimer uniquement la partie correspondante d'une ligne (à l'exclusion des lookarounds) au lieu de la ligne entière.
Dans un deuxième temps, nous dirigeons le résultat de cette première commande vers cette commande sed
:
sed -r 's/and |,|.com//g;y/ /\n/'
Cette ligne sed
contient en fait deux commandes, s/and |,|.com//g
et y/ /\n/
.
Tout d'abord, s/PATTERN/REPLACEMENT/
recherche l'expression régulière (expression rationnelle étendue, en raison de l'option -r
). Motif and |,|.com
, ce qui signifie and
, ,
ou .com
. Ensuite, il remplace cela par rien, ces motifs sont donc réellement supprimés de la ligne d'entrée. Le g
à la fin permet la recherche globale et le remplacement au lieu de simplement traiter la première correspondance sur chaque ligne.
Deuxièmement, y/CHARACTERS/REPLACEMENTS/
traduit tous les caractères du premier champ en leurs caractères correspondants dans le deuxième champ. Ici, je l’utilise pour convertir simplement tous les espaces restants en sauts de ligne.