The UNIX and Linux Forums  


Go Back   Les systèmes UNIX et Linux Forums > Top Forums > De programmation et de script Shell
.
google unix.com



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

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 06-09-2008
mecano mecano is offline
Registered User
  
 

Date d'inscription: juin 2008
Messages: 4
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: /
  #2 (permalink)  
Old 06-09-2008
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
addict
  
 

Join Date: Jan 2007
Lieu: Варна, България / Milano, Italia
Posts: 2,915
Si l'ordre n'est pas important:

(utilisation nawk / ou usr/xpg4/bin/awk sur Solaris)


Code:
awk 'END{for(k in _)print _[k]}{_[$NF]=$0}' file1 file2

Sinon, étant donné votre exemple:


Code:
awk 'END{for(k in _)print _[k]}{_[$NF]=$0}' file1 file2 |
  sort -k3n


Dernière édition par radoulov; au 06.09.2008 10:39 AM..
  #3 (permalink)  
Old 06-09-2008
mecano mecano is offline
Registered User
  
 

Date d'inscription: juin 2008
Messages: 4
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 ^ ^
  #4 (permalink)  
Old 06-09-2008
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
addict
  
 

Join Date: Jan 2007
Lieu: Варна, България / Milano, Italia
Posts: 2,915
Citation:
Posté par mecano View Post
[...]
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 ...
[...]
Il utilise un tableau associatif (une table de hachage), il garantit le caractère unique
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:
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?
Eh bien, c'est un peu le style de l'écriture,
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:
A propos de la commande sort ne serait pas échouer sur le »,«?
Je pense que le type de commande se lancer correctement. Avez-vous un exemple de cas où l'entrée comme celle-ci ne sont pas triées correctement?

Citation:
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?
Pourquoi? N'est-ce pas le dernier champ en position fixe?
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

  #5 (permalink)  
Old 06-09-2008
mecano mecano is offline
Registered User
  
 

Date d'inscription: juin 2008
Messages: 4
Merci beaucoup de prendre le temps d'expliquer tout cela radoulov ^ ^ c'est vraiment génial!

Citation:
Je pense que le type de commande se lancer correctement. Avez-vous un exemple de cas où l'entrée comme celle-ci ne sont pas triées correctement?
pas bien dans ce cas particulier mais je me souviens d'avoir à la bande »,« être en mesure d'utiliser 'sort-n' correctement (sans préciser une touche, i suffit d'extraire dernier champ avec awk puis appliquer sort-n pour lui. Une honte 'sort' ne permet pas d'inverser touche de sélection), par exemple avec des valeurs telles que:
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 ^ ^
  #6 (permalink)  
Old 06-10-2008
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
addict
  
 

Join Date: Jan 2007
Lieu: Варна, България / Milano, Italia
Posts: 2,915
Citation:
[...]
Si vous n'avez pas peur de lire le code horrible je peux poster ^ ^
Oui, bien sûr, d'après elle.
Vous pouvez obtenir des conseils utiles ici.
  #7 (permalink)  
Old 09-12-2008
s.rajkumar s.rajkumar is offline
Registered User
  
 

Date d'inscription: août 2008
Messages: 1
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.
Closed Thread

Bookmarks

Tags
solaris

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 01:34 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0