2010-10-18 5 views
1

J'ai un ensemble de données qui ressemble à ce qui suit:
film (année) genre
par exemple.tout d'impression pour correspondre à motif

quelques mots (1934) Action

Mon but est de saisir chaque champ « film » et vérifier un fichier différent qui a aussi un tas de films et supprimer les lignes du second fichier qui ne contiennent pas film. J'ai essayé d'utiliser awk pour faire cela, mais j'ai seulement réussi à faire correspondre le champ de l'année. Est-il possible de créer une variable pour le champ de film? Je pense que la façon la plus simple de le faire serait de faire correspondre le champ de l'année et de créer une variable à partir de tout ce qui précède chaque ligne. Je n'ai pas été capable de comprendre cela, est-ce qu'il y a un moyen de faire cela qui pourrait être plus facile que ma suggestion?

Répondre

3

en supposant que votre ensemble de données est dans un fichier

$ cat dataset 
Terminator (19XX) action 
The Ghostrider (2009) supernatural 

$ awk -F"[()]" '{print $1}' dataset 
Terminator 
The Ghostrider 

$ awk -F"[()]" '{print $1}' dataset > movie_names 

$ grep -f movie_names secondfile 
$ grep -f secondfile movie_names 

Bien sûr, vous pouvez le faire avec juste awk ainsi

awk -F"[()]" 'FNR==NR { m[++d]=$1;next } { for(i=1;i<=d;i++){if($0 ~ m[i]){ print }}}' dataset secondfile 
+0

c'est génial! Je ne savais pas que -F accepte les expressions régulières. Vous pouvez combiner ceci en une ligne de commande comme "awk -F" [()] "'{print $ 1}' dataset | fgrep -f - secondfile De cette façon, vous n'avez pas besoin du fichier temporaire movie_names –

+0

Merci pour la réponse, cela fera exactement ce dont j'avais besoin @raha Je vais devoir essayer ce oneliner, on dirait que ça marcherait bien – Isawpalmetto

0

Vous pouvez demander sed de supprimer le champ de l'année et tout ce qui vient après ça.

$ cat file | sed 's/([0-9]\+).*//' 

Cela retournera uniquement le nom du film sur chaque ligne. Vous pouvez ensuite le diriger vers une boucle while read;.

Si nécessaire, vous pouvez affiner l'expression rationnelle de sorte qu'elle ne corresponde qu'aux 4 chiffres (celui-ci correspond à n'importe quel nombre de chiffres entre les parenthèses).

Questions connexes