![]() |
|
|
google unix.com
|
|||||||
| Forums | S'inscrire | Forum Rules | Liens | Albums | FAQ | Liste des membres | Calendrier | Recherche | Aujourd'hui, les postes | Marquer les forums comme lus |
| De programmation et de script Shell Posez vos questions à propos de KSH, CSH, SH, BASH, PERL, PHP, SED, awk et d'autres scripts shell et les langages de script shell ici. |
Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
|
||||
| Fil | Thread Starter | Forum | Réponses | Last Post |
| Sed Aide à la mise à jour quelque chose de particulier que dans un seul fichier. | bisla.yogender | De programmation et de script Shell | 4 | 03-24-2008 11:48 AM |
| À savoir si le fichier est mise à jour ou pas | raj333 | De programmation et de script Shell | 2 | 11-05-2007 05:29 PM |
| Mise à jour le fichier en boucle | fuite | De programmation et de script Shell | 4 | 06-20-2007 02:37 PM |
| Pourquoi ma sar n'est pas mise à jour du fichier de sortie. | skneeli | UNIX for Advanced & Expert Users | 1 | 11-12-2006 08:29 PM |
| Mise à jour d'un fichier dans une archive Zip | dbridle | AIX | 6 | 09-27-2006 04:29 PM |
![]() |
|
|
LinkBack | Thread Tools | Recherche sur ce Thread | Rate Thread | Modes d'affichage |
|
|
|
||||
|
awk mise à jour d'un fichier avec un autre, la comparaison, la mise à jour
Bonjour,
J'ai lu et de recherche par le biais de ce merveilleux forum et a tenté des approches différentes mais il semble que je manque une certaine connaissance et neurones ^ ^ Voici ce que je tente de réaliser: fichier1: test Filea 3495; test fileb 4578; test filec 7689; test Filey 9978; test Filez 12300; file2: test Filea 3495; test déposé 4578; test filec 7689; test filex 8978; résultats: test Filea 3495; test déposé 4578; test filec 7689; test filex 8978; test Filey 9978; test Filez 12300; comparaison basée sur le dernier champ (champ $ 3), le contenu de fichier2 (ici le contenu de "clé" de 8978 est nouvelle) doit être ajoutée à la production finale et le contenu qui est différent dans file2 (test déposé 4578; ici) devrait remplacer un fichier1 . c'est ici que je suis maintenant: awk 'NF ($ key \u003d NF; touches [key] + +) NR \u003d\u003d FNR (key1 [key] \u003d $ NF ORS; rec1 [key] \u003d $ 0 ORS; next) (key2 [key] \u003d $ NF ORS; rec2 [key] \u003d $ 0 ORS; next) END (for (k dans les clés) (if (key1 [k] \u003d\u003d key2 [k]) (print rec2 [k]) else (print rec1 [k]))) ' $ file1 $ file2> $ file1.updated pour des raisons de lisibilité: awk ' NF ( $ key \u003d NF; touches [key] + + ) NR \u003d\u003d FNR ( key1 [key] \u003d $ NF ORS; rec1 [key] \u003d $ 0 ORS; suivant ) ( key2 [key] \u003d $ NF ORS; rec2 [key] \u003d $ 0 ORS; suivant ) FIN ( for (k dans les clés) ( if (key1 [k] \u003d\u003d key2 [k]) ( print rec2 [k] ) autre ( print rec1 [k] ) ) ) ' $ file1 $ file2> $ file1.updated mais .. cela ne fonctionne pas bien: / |
|
||||
|
oh my ....
![]() thanks a lot! Je pense que la solution a été quelque chose comme ranger les clés de file1, file2 iterate sur, puis inverser la iteration à retrouver les records ... J'étais bien loin de la beauté de awk ... si je comprends bien, awk lit les deux fichiers et les dossiers automatiquement fusionné lui-même? Cela signifie qu'il n'est pas nécessaire de stocker des valeurs de file1 de les comparer aux file2? Belle ... Deux choses que je ne suis pas: l'utilisation du soulignement (alors que je pense qu'il est pour "lire tous les dossiers"?), Et pourquoi est-END pas à la fin? A propos de la commande sort ne serait pas échouer sur le »,«? Savez-vous comment spécifier «champ» de la ligne de tri? Ou quelque chose comme: | Awk '(printf substr ($ NF, 1, length ($ NF) -1); $ NF \u003d "" printf "% s \ n", $ 0)' | sort-n | awk '(printf "% s % s; \ n ", 0 $, $ 1) '| awk' ($ 1 \u003d" "; sub (/ ^ + /," "); printf"% s \ n ", $ 0) ' préférable? Merci beaucoup de nouveau radoulov ^ ^ |
|
|||||
|
Citation:
de la clé ($ NF dans ce cas) et la valeur est toujours la dernière fois qu'il voit (celui dans file2). Il sera associé à chaque clé ($ NF) l'ensemble du dossier ($ 0), et il mettra à jour la valeur quand elle voit la même touche. Citation:
il vous voulez que le code plus lisible, vous pouvez l'utiliser à la place (et cela est même compatible avec l'ancienne plaine awk Solaris): Code:
awk '{
key_record[$NF] = $0 # associate key ($NF) with entire record ($0)
}
END {
# after the entire input has been read
for (key in key_record) # for every key stored
print key_record[key] # print the associated value
}' file1 file2
Citation:
Citation:
Dans ce cas, je voudrais aller à: Code:
perl -lane'
$h{$F[-1]} = $_;
print join "\n", map $h{$_}, sort {$a <=> $b} keys %h
if eof'
Ou (si vous voulez vraiment vous débarrasser de la "," tandis que le tri): Code:
perl -lane'
chop $F[-1] and $h{$F[-1]} = $_;
print join "\n", map $h{$_}, sort {$a <=> $b} keys %h
if eof'
Sinon, l'aide de tri + shell: Code:
read<file;set -- $REPLY;sort -k$#n file |
|
||||
|
Merci beaucoup de prendre le temps d'expliquer tout cela radoulov ^ ^ c'est vraiment génial!
Citation:
27384; 7384, ou 384; mais j'ai essayé tellement de choses différentes, je suppose que ce doit être un reste de quelque mistypes / erreurs de ma part ou à cause de la ligne de Windows terminaisons des fichiers semble avoir (certains fichiers sont créés sur Windows et sur certains Unix)? Non, le dernier champ n'est pas fixe, car je suis sur un script bash utilité pour les requêtes SQL de tri des fichiers et la mise à jour, ce doit être utilisé sur plusieurs dossiers dans lesquels le nombre de champs n'est pas toujours le même et où la valeur de la clé peut être , mais se produit rarement, au milieu de la ligne. Donc dans ce cas de prendre une clé $ arguments de climat: awk 'END (for (k dans _) print _ [k ]}{_[$'"$ clé "']\u003d$ 0)' $ file1 $ file2> $ file1.updated avec un argument supplémentaire à condition de'0 'pour la fin de la ligne (parce que je n'ai pas eu $ key de se transformer en prenant NF et awk "$ key"). Je fais cela pour une petite communauté, et il doit être très simple. Si vous n'avez pas peur de lire le code horrible je peux poster ^ ^ |
|
||||
|
Salut suis de nouveau à awk et unix, ma condition est très similaire à ce ..
Je veux comparer par la première colonne, fichier1: 0000-00058 | Green 0000-00059 | Green 0000-00060 | Green 0402-01055 | Green 0402-01058 | Green 0402-01059 | Green 0402-01061 | Green 0402-01065 | Green file2: 0000-00057 | Rouge 0000-00058 | Blue 0000-00059 | Rouge 0000-00060 | Blue Mon résultat doit être 0000-00058 |Bleu 0000-00059 |Rouge 0000-00060 |Bleu 0402-01055 | Green 0402-01058 | Green 0402-01059 | Green 0402-01061 | Green 0402-01065 | Green 0000-00057 | Rouge en attente de votre réponse ... Thank u. |
![]() |
| Bookmarks |
| Tags |
| solaris |
| Thread Tools | Recherche sur ce Thread |
| Modes d'affichage | Rate this thread |
|
|