Comment parsingr les mots dans awk?

Je me demandais comment parsingr un parragraph qui ressemble à ceci:

Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text And many other lines with text that I do not need * * * * * * * Autolisp - Dialect of LISP used by the Autocad CAD package, Autodesk, Sausalito, CA. CPL - 1. Combined Programming Language. U Cambridge and U London. A very complex language, syntactically based on ALGOL-60, with a pure functional subset. Modula-3* - Incoprporation of Modula-2* ideas into Modula-3. "Modula-3*: 

Je peux donc obtenir la sortie suivante de la phrase awk:

 Autolisp CPL Modula-3* 

J’ai essayé les phrases suivantes parce que le fichier que je veux filtrer est énorme. C’est une liste de tous les langages de programmation existants jusqu’à présent, mais fondamentalement toutes les lignes suivent le même schéma que ci-dessus

Les phrases que j’ai utilisées jusqu’à présent:

 BEGIN{$0 !~ /^ / && NF == 2 && $2 == "-"} { print $1 } BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} /^FLIP -/{print $1,$3} BEGIN{RS=""; FS=OFS="\n"} {print $1 NF-1} BEGIN{NF == 2 && $2 == "-" } { print $1 } BEGIN { RS = "" } { print $1 } 

Les phrases qui ont fonctionné pour moi jusqu’à présent sont:

 BEGIN { RS = "\n\n"; FS = " - " } { print $1 } awk -F " - " "/ - /{ print $1 }" file.txt 

Mais il imprime encore ou saute des lignes dont j’ai besoin / n’ai pas besoin.

Merci pour votre aide et votre réponse! Je me suis cassé la tête depuis quelques jours parce que je suis une recrue avec la programmation AWK

Le FS par défaut devrait être correct, pour éviter les lignes en double, vous pouvez diriger le résultat vers sort -u

 $ gawk '$2 == "-" { print $1 }' file | sort -u Autolisp CPL Modula-3* 

Il peut ne pas filtrer tout ce que vous voulez, mais vous pouvez continuer à append des règles jusqu’à ce que les mauvaises données soient filtrées.

Vous pouvez également éviter d’utiliser le sort en utilisant un tableau associatif:

 $ gawk '$2=="-" { arr[$1] } END { for (key in arr) print key}' file Autolisp CPL Modula-3* 

S’il n’est pas nécessaire que ce soit avec awk, il faudrait probablement d’abord utiliser grep pour sélectionner les lignes du bon formulaire, puis utiliser sed pour couper la fin, comme suit:

 grep -e '^.* -' | sed -e 's/\(^.*\) -.*$/\1\n/; p;' 

Edit: Après avoir joué avec awk, il semble que votre problème réside dans le fait que vous n’avez pas toujours «[langagename] – [stuff]», mais plutôt «[languagename] – \ n [stuff]» le cas avec CPL dans le texte d’exemple, et par conséquent, FS = “-” ne sépare pas sur des choses comme ça.

Aussi, une des choses à essayer est la suivante:

 BEGIN { r = "^.* -"; } { if (match($0, r)) { printf("%s\n", substr($0, 1, RSTART + RLENGTH - 3)); } } 

Je ne sais pas vraiment beaucoup sur awk, mais c’est ma meilleure hypothèse pour reproduire ce que font les grep et sed ci-dessus. Cela semble fonctionner sur l’exemple de texte que vous avez donné, au moins.