2010-04-29 4 views
0

Je suis assez nouveau à l'expression régulière et j'ai juste commencé à apprendre à utiliser awk. Ce que je suis en train d'accomplir est d'écrire un script ksh à lire dans les lignes de texte, et ainsi que pour toutes les lignes qui correspondent à ce qui suit:Comment utiliser regex pour correspondre à ASTERISK dans awk

* RECORD 0000001 [s #]

pour remplacer 2 $ (c.-à-000001) avec un nombre différent. Donc, essentiellement, le script lit en sauvegarde d'enregistrement de lot, et remplace le numéro d'enregistrement par date + record #, et écrit dans un fichier séparé.

donc ce que je pense le format devrait être:

awk 'match($0,"/*RECORD")!=0{$2="$DATE-n++"; print $0} match($0,"/*RECORD")==0{print $0}' $BATCH > $OUTPUT 

mais il est évident «/* RECORD » ne va pas travailler, et je ne sais pas si le changement de 2 $ puis écrire le ligne entière est la bonne façon de le faire. J'ai donc besoin de quelques éclaircissements sérieux.

+0

D'où vient "FTR"? Voulez-vous "$ DATE" littéralement ou pour remplacer une date? Est-ce que "n ++" est littéral ou voulez-vous incrémenter une variable? –

+0

Désolé à ce sujet. J'ai édité le post original maintenant. Ce code était à l'origine pour d'autres scripts, que j'ai oublié de changer le VAR. $ DATE est une variable que je vais définir dans le script, et n ++ juste var incrémentielle, en partant de là où j'ai défini plus tôt dans le script, qui est omis ici. –

Répondre

1

Vous voulez que votre ligne d'exemple pour ressembler

*RECORD $DATE-n++ [some_serial_#] 

après awk est fait avec elle?

awk '{ if (match($0, "*RECORD") != 0) { $2="$DATE-n++"; }; print }' $BATCH > $OUTPUT 

Sur la base de votre mise à jour, il semble que vous attendez plutôt $DATE être une variable d'environnement qui est utilisé dans l'expression de awk et n est une variable dans le script awk qui tient compte du nombre d'enregistrements correspondait au motif. Compte tenu de cela, cela peut ressembler plus à ce que vous voulez.

$ cat script.awk 
BEGIN { n=0 } 
{ 
    if (match($0, "\*RECORD") != 0) { 
     n++; 
     $2 = (ENVIRON["DATE"] "-" n); 
    } 
    print; 
} 

$ awk -f script.awk $BATCH > $OUTPUT 
+0

Je ne devais pas l'obtenir tout à fait raison ... J'ai eu cette sortie d'erreur "awk: 0602-521 Il y a une erreur d'expression régulière./n ? * + Non précédé d'une expression valide./n /n le numéro de ligne source est 1./n Le contexte d'erreur est/n {if (match ($ 0, >>> "* FTR") <<

+0

Alors votre awk a besoin du '*' pour être échappé - 'match ($ 0" \\ * RECORD ")'. Mine était le contraire et a donné un avertissement que j'échappais inutilement le '*'. – jamessan

+0

Peu importe la façon dont j'ai essayé je ne peux pas le faire correctement: Le contexte d'erreur est {if (match ($ 0, >>> "\ * RECORD") <<< –

0

utiliser l'égalité.

D=$(date +%Y%m%d) 
awk -vdate="$D" ' 
{ 
    for(i=1;i<=NF;i++){ 
    if ($i == "*RECORD"){ 
     $(i+1) = date"00002" 
     break # break after searching for one record, otherwise, remove break 
    } 
    } 
}1' file 
+0

merci pour la suggestion, après quelques réglages sur mon propre, je l'ai finalement eu pour faire ce dont j'avais besoin! –

Questions connexes