0
votes

Supprimer les mots en double consécutifs d'un fichier à l'aide de AWK ou SED

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


5 commentaires

Qu'est-ce que vrai! @ # Vrai% & sortie? vrai% vrai% vrai% ? true! vrai $ vrai ^ ? ou vrai, vrai rohith ? 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 ?


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?


6 Réponses :


1
votes

Ce n'est pas exactement ce que vous avez montré en sortie, mais est proche d'utiliser gnu-awk : xxx

xxx


0 commentaires

0
votes

Selon votre entrée attendue, cela pourrait fonctionner: xxx

([A-ZA-Z0-9 _-] +) = mots qui pourraient être répétés .

(*) \ 1 = Vérifiez si le mot précédent est répété après un espace.

S / ([.,; ]) / \ 1 / g = Supprime des espaces supplémentaires avant la ponctuation (vous pouvez ajouter des caractères à ce groupe).

S / / / g = Supprime Double espaces.

Ceci fonctionne avec GNU SED.


0 commentaires

5
votes

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?”


1 commentaires

C'est une utilisation exceptionnelle des "SEPS" dans SPLIT (). Très intelligent.



3
votes

correspond à la même correspondance de la même arrière-plan dans SED: xxx

Comment ça marche:


4 commentaires

Cela vous dérangerait-il de détailler l'expression SED que vous écrivez dès le début de votre réponse?


rs = '^' signifie que l'enregistrement est divisé à chaque caractère ^ , mais il n'y a aucune raison particulière de penser ^ 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 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!



1
votes
:~$ sed -E 's/(\w+) *\1/\1/g' sample.txt
“true, rohith Rohith;
cold burn, and fact and fact good?”

0 commentaires

3
votes

simple sed : xxx


0 commentaires