Mon fichier d'entrée ressemble ci-dessous:
awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s ",$i,FS)}{printf("\n")}' input.txt
6 Réponses :
Ce n'est pas exactement ce que vous avez montré en sortie, mais est proche d'utiliser p> gnu-awk code>:
Selon votre entrée attendue, cela pourrait fonctionner: ([A-ZA-Z0-9 _-] +) strong> = mots qui pourraient être répétés . P> (*) \ 1 strong> = Vérifiez si le mot précédent est répété après un espace. p> S / ([.,; ]) / \ 1 / g strong> = Supprime des espaces supplémentaires avant la ponctuation (vous pouvez ajouter des caractères à ce groupe). P> S / / / g strong> = Supprime Double espaces. P> Ceci fonctionne avec GNU SED. P> P>
avec GNU AWK pour le 4ème Arg à scinder ():
$ cat tst.awk { n = split($0,words,/[^[:alpha:]]+/,seps) prev = "" for (i=1; i<=n; i++) { word = words[i] if (word != prev) { printf "%s%s", seps[i-1], word } prev = word } print "" } $ awk -f tst.awk file âtrue, rohith Rohith; cold burn, and fact and fact good?â
C'est une utilisation exceptionnelle des "SEPS" dans SPLIT (). Très intelligent.
correspond à la même correspondance de la même arrière-plan dans SED: Comment ça marche: p> sans le Vous trouverez ci-dessous mon autre solution, qui suppriment également des mots répétés entre les lignes. P> Ma première solution était avec mais j'ai remarqué que à la place de zéro octet quelque chose d'unique pourrait être utilisé comme séparateur d'enregistrement. , par exemple Testé sur REPL . La sortie des extraits: p>
: l code> - Créez une étiquette
l code> pour passer à. Voir
TL code> ci-dessous. LI>
s code> - substitut
/ code> li>
\ (^ \ | [^ [: alpha:]] \) code> - correspondre au début de la ligne ou du caractère non alphabétique. C'est ainsi que la partie suivante correspond à l'ensemble du mot, non seulement suffixe. Li>
\ ([[[[alpha:]]] \ {1, \ \ \ \ \ \ \) code> - correspond à un mot - un ou plusieurs caractères alphabétiques. li>
[^ [: alpha:]]] \ {1, \} code> - correspond à un non-mot - un ou plusieurs caractères non alphabétiques. LI>
\ 2 code> - correspond à la même chose que dans la seconde
\ (... \ \) code> - c'est-à-dire. correspondre au mot. li>
\ ($ \ | [^ [^ [^ [: alpha:]] \) code> - correspond à la fin de la ligne ou correspond à un caractère non alphabétique. C'est donc nous correspondons à l'ensemble du deuxième mot, non seulement son préfixe. Li>
/ code> li>
\ 1 \ 2 \ 3 code> - Substituez-le pour
/ code> li>
g code> - substituer globalement. Mais, parce que la regex ne reviendra jamais, elle substituera 2 mots à la fois. Li>
ul> li>
tl code> - Aller à l'étiquette
l code> si la commande
s code> s code> réussite. Ceci est ici, de sorte que quand il y a 3 mots la même chose, comme
vrai vrai vrai code>, ils sont correctement remplacés par un seul
true code>. Li>.
ul>
\ (^ \ | [^ [| [: alpha:]] \) code> et
\ ($ \ [^ [| [^ [: ALPHA:]] \) code>, sans eux par exemple
vrai rue code> serait substitué par
true code>, car le suffixe
RUE RUE CODE> correspondrait. P>
UNIQ code>. Donc, je vais d'abord transformer l'entrée en paires avec le format
code>. Puis exécutez-le via uniq -f1 code> avec ignorer le premier champ, puis convertissez-le. Ce sera très lent: p>
sed code> fait un bon travail pour jeton de la saisie - il place zéro octets entre chacun jetons de mot et de mots. Donc, je pourrais facilement lire le flux. Je peux ignorer des mots répétés en awk en lisant zéro ruisseau séparé dans GNU awk et en comparant le dernier mot lisé: p>
^ code> caractère, de cette façon, il pourrait être utilisé avec une version non-GNU AWK, testée avec Mawk disponible sur RÉPL. Raccourci le script en utilisant des noms de variables plus courts ici: p>
Cela vous dérangerait-il de détailler l'expression SED que vous écrivez dès le début de votre réponse?
rs = '^' code> signifie que l'enregistrement est divisé à chaque caractère
^ code>, mais il n'y a aucune raison particulière de penser
^ code> ne peut pas apparaître dans le Entrée, vous feriez mieux d'utiliser du caractère de contrôle, car c'est probablement moins susceptible d'apparaître .. N'utilisez jamais une variable nommée
l code> BTW car il ressemble beaucoup trop au nombre
1 < / code> et donc obscosser votre code.
@RVBarreto Il y a une explication complète des points ci-dessous, j'ai essayé de l'expliquer. Peut-être que je pourrais essayer de mieux expliquer?
@Kamilcuk qui était parfait!
:~$ sed -E 's/(\w+) *\1/\1/g' sample.txt âtrue, rohith Rohith; cold burn, and fact and fact good?â
simple sed code>:
Qu'est-ce que
vrai! @ # Vrai% & code> sortie?
vrai% vrai% vrai% code>?
true! vrai $ vrai ^ code>? ou
vrai, vrai rohith code>? La question générale - que faire cette chose qui sépare des mots répétés? Note latérale: je pense que c'est difficile.
Avez-vous essayé d'utiliser la commande
uniq code>?
Qu'est-ce qui constitue un duplicata?
Il n'y a aucun moyen d'utiliser UNIQ sur des "mots". Vous devriez avoir des mots sur des lignes séparées.
Qu'en est-il des paires séparées par une nouvelle ligne? Sont-ils à remplacer?