2016-10-17 2 views
0

Je reluquer à ma disposition et j'ai le texte suivant je souhaite formater:Comment est-ce que je pourrais mettre en forme le titre qui inclut une date utilisant gawk et sed?

Trip.to.Washington.2004.08... 
Florida.1993.12... 
Aunt.Rose.2011.06... 

Je voudrais qu'il apparaisse comme suit:

Trip to Washington (2004) 
Florida (1993) 
Aunt Rose (2011) 

Le nombre de mots dans le titre varie tout comme la quantité de mots suivant l'année. Le séparateur est parfois un espace blanc plutôt qu'une période.

Edit:

j'ai pu obtenir la sortie désirée à l'aide:

echo Trip.to.Washington.2004.08... | 
sed -n 's/\([0-9][0-9][0-9][0-9]\).*/\1/p' | 
gawk 'BEGIN { FS="." } { print $1" "$2" "$3" ("$NF")" }' 

qui retourne:

Trip to Washington (2004) 

Le problème est que cela échouera s'il y a plus ou moins , mots dans le titre. Il échouera également si les mots sont séparés par autre chose qu'un point.

J'ai aussi trouvé qu'il est possible de retourner tous les domaines, sauf pour le dernier champ à l'aide:

awk '{$NF=""; print $0}' file 

Malheureusement, mon expérience avec gawk est très limitée. Je n'ai aucune idée de comment utiliser correctement cette déclaration dans mon gawk existant.

+0

J'ai modifié mon post pour inclure mes tentatives. –

Répondre

0

Avec sed:

$ sed 's/\([0-9]\{4\}\).*/(\1)/; s/\./ /g' foo 
Trip to Washington (2004) 
Florida (1993) 
Aunt Rose (2011) 

Expliqué:

  • premier Surround 4 numéros de chiffres et tout ce qui les suit avec des parenthèses en utilisant rétro-référencement: s/\([0-9]\{4\}\).*/(\1)/;
  • revisser périodes avec l'espace s/\./ /g
0

Vous pouvez aussi facilement effectuer la substitution dans Awk. Si les mots que vous souhaitez remplacer sont toujours les cinq derniers jetons sur la ligne séparés par un point, vous pourriez faire quelque chose comme

echo "Trip.to.Washington.2004.08..." | 
gawk -F . '{ for(i=1; i<=NF-5; ++i) printf "%s ", $i; print "(" $NF-4 ")" }' 

boucle Nous sur les jetons jusqu'à cinq moins de NF et d'imprimer chaque suivi d'un espace . Ensuite, nous imprimons le suivant qui reste à l'intérieur d'une paire de parenthèses, et n'imprimons jamais le reste.

Donc quand i est 1, nous imprimons $1, qui dans ce cas est Trip, suivi d'un espace.

Lorsque i est 2, nous imprimons $2, qui dans ce cas est to, à nouveau suivi d'un espace.

Lorsque nous atteignons Washington la boucle se termine car il s'agit du cinquième champ comptant à partir de la fin. Nous imprimons cela suivi d'un espace aussi, puis sortons de la boucle.

Ensuite, nous imprimons encore le quatrième de la fin entouré par des parenthèses, ce qui devrait nous obtenir l'année.

Le -F . est un raccourci pour votre BEGIN { FS="." } mais j'ai fait ce changement juste pour la brièveté; de toute façon fonctionne bien.

Il n'y a rien gawk spécifique ici donc vous pouvez également utiliser le awk générique.

+0

Si les deux derniers points de votre exemple ne sont que des espaces réservés pour les chiffres, les décalages vont changer, bien sûr. Essayez avec 'NF-3' pour la boucle' for' et 'NF-2' pour l'année entre parenthèses si vos noms de fichiers réels sont comme' Trip.to.Washington.2004.08.23-25' plutôt que ce que vous montrez dans ta question. – tripleee