Bonjour tout le monde,
J'aurai besoin d'un coup de main. J'ai 2 fichiers plat txt qui ressemble un peu à ca :
Contenu du fichier 1 :
a
b
c
d
e
f
g
Contenu du fichier 2 :
a
f
Comment je peux faire avec awk pour afficher sur la sortie standard le contenu du fichier 1 sans les lignes du fichier 2 ? A savoir...
b
c
d
e
g
Merci par avance pour le coup de main !
# Parcequ'il faut un sujet.
Posté par NULL . Évalué à 2.
[^] # Re: Parcequ'il faut un sujet.
Posté par cho7 (site web personnel) . Évalué à 3.
Sinon, en python ça donne :
with open("txt1.txt") as f1:
lines1 = f1.readlines()
with open("txt2.txt") as f2:
lines2 = f2.readlines()
lines = [line.strip() for line in lines1 if line not in lines2]
for line in lines:
print line
Je sais c'était pas la question, mais ça me fait plaisir :)
[^] # Re: Parcequ'il faut un sujet.
Posté par Fluke . Évalué à 1.
Merci pour vos remarques, je vais tester ça demain et je repasse par ici pour voir si ça répond bien à mon besoin.
[^] # Re: Parcequ'il faut un sujet.
Posté par cho7 (site web personnel) . Évalué à 2.
awk c'est vraiment simple, je te redirige vers ce tutorial qui je suis sûr va éclairer tes lanternes : http://www.grymoire.com/Unix/Awk.html
Après pour ta problématique, il y a plein d'autres trucs mieux que awk, notamment la solution grep évoquée plus bas par Krunch, même si j'émets des réserves dans la mesure où ton fichier 2 ne doit alors contenir aucun caractères joker sinon le résultat pourrait être différent de celui attendu voir ca peut générer une erreur si une ligne correspond à un mauvais format de pattern.
Krunch tu confirmes ?
[^] # Re: Parcequ'il faut un sujet.
Posté par cho7 (site web personnel) . Évalué à 2.
[^] # Re: Parcequ'il faut un sujet.
Posté par Fluke . Évalué à 1.
Pour des cas plus "compliqués" (pour moi) c'est vrai que awk en mode online, ce n'est pas gérable.
Merci en tout cas pour vos retours.
[^] # Re: Parcequ'il faut un sujet.
Posté par cho7 (site web personnel) . Évalué à 1.
[^] # Re: Parcequ'il faut un sujet.
Posté par Fluke . Évalué à 1.
# grep -v -f fichier2 fichier1
Posté par Krunch (site web personnel) . Évalué à 8.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: grep -v -f fichier2 fichier1
Posté par cho7 (site web personnel) . Évalué à 1.
Question bonus que l'auteur de ce topic ne posera surement pas mais qui m'intéresse, si dans le fichier spécifié par -f il y a des caractères joker, il y a moyen de les interpréter comme des caractères normaux ?
[^] # Re: grep -v -f fichier2 fichier1
Posté par Krunch (site web personnel) . Évalué à 1.
> il y a moyen de les interpréter comme des caractères normaux ?
Oui.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: grep -v -f fichier2 fichier1
Posté par NULL . Évalué à 2.
Mais par contre, on ne peut plus virer les lignes vides de fichier1. Faut repasser un coup de grep derrière.
[^] # Re: grep -v -f fichier2 fichier1
Posté par NULL . Évalué à 3.
Et puis, tant que j'y suis, une technique que j'ai lue sur un blog :
cat fichier1 fichier2 fichier2 | sort | uniq -u
Mais le résultat est dans le désordre par rapport à fichier1 et il faut que toutes les lignes de fichier1 soient uniques.
Et c'est aussi peut être plus long.
[^] # UUOC
Posté par Krunch (site web personnel) . Évalué à 3.
Dans le cas général, grep reste sans doute plus rapide.
Sinon je note qu'il manque une page Wikipedia sur Commentz-Walter.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
# diff
Posté par Frédéric Perrin (site web personnel) . Évalué à 5.
La solution la plus naturelle :
diff a b | grep '^>' | cut -b 3-
Ou en jouant avec sed :
diff a b | sed -n 's/> \(.*\)$/\1/gp'
[^] # Re: diff
Posté par Fluke . Évalué à 2.
Merci à toi en tout cas :-)
# Join
Posté par castorpilot . Évalué à 5.
join -v 1 file1 file2
[^] # Re: Join
Posté par castorpilot . Évalué à 2.
awk 'NR == FNR{ligne[$1]=1} NR != FNR {if(!($1 in ligne))print}' file2 file1
ou en formaté correctement ;-)
NR == FNR { ligne[$1] = 1 }
NR != FNR {
if ( !($1 in ligne))
print
}
avec en entrée file2 file1
Explications :
l'astuce FNR == NR sert à savoir si on est en train de lire le premier fichier ou le second.
Donc si on est en train de lire file2, FNR == NR, et on remplit un tableau avec pour clef l'entrée qui se trouve sur la ligne.
Si on lit le second fichier (qui est en fait file1), on n'a plus qu'à verifier que la ligne lue n'était pas présente dans le fichier 2 (l'operateur "in" sur le tableau "ligne"). Si c'est le cas, on affiche la ligne.
[^] # Re: Join
Posté par Fluke . Évalué à 1.
Merci !
#
Posté par totof2000 . Évalué à 5.
... Parce qu'il ne faut pas de titre.
[^] # Re:
Posté par Fluke . Évalué à 1.
[^] # Re: Re:
Posté par totof2000 . Évalué à 2.
[^] # Re:
Posté par Axioplase ıɥs∀ (site web personnel) . Évalué à 2.
comm -23 un.txt deux.txt
[^] # Re: Re:
Posté par gaaaaaAab . Évalué à 2.
- ne pas être POSIX
- avoir un format d'ouput ...discutable
- utiliser des paramètres arbitraires (1, 2, 3 ... soleil ?). Enfin ça, c'est une conséquence du point précédent.
sinon, je ne la connaissais pas non plus. C'est toujours bien pour la culture, mais je vais surtout m'empresser de jamais m'en servir :-)
[^] # Re: Re:
Posté par Axioplase ıɥs∀ (site web personnel) . Évalué à 2.
The comm utility conforms to IEEE Std 1003.2-1992 (``POSIX.2'').
The -i option is an extension to the POSIX standard.
- Il me sort bien un mot par ligne, qui est dans un.txt mais pas dans deux.txt, comme attendu.
- entièrement d'accord.
Je fais le blasé, mais j'ai découvert la commande deux jours avant qu'on poste ce journal, en ayant besoin de calculer l'intersection et la différence d'ensembles en bash (pour un script d'install qui recommence en cas d'erreur sans repartir à zéro).
[^] # Re: Re:
Posté par gaaaaaAab . Évalué à 2.
concernant l'output, je ne lui reproche pas de ne pas fonctionner hein. C'est juste que je suis pas fan du csv :D
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.