2013-06-12 6 views
1

J'utilise la déclaration suivante dans awk avec le texte canalisé vers d'une autre commande:Awk impression si aucune correspondance

awk 'match($0,/(QUOTATION|TAX INVOICE|ADJUSTMENT NOTE|DELIVERY DOCKET|PICKING SLIP|REMITTANCE ADVICE|PURCHASE ORDER|STATEMENT)/) && NR<11 {print substr($0,RSTART,RLENGTH)}' 

qui travaille presque pour ce que je dois (trouver un des mots dans l'expression rationnelle au sein les 10 premières lignes de l'entrée et imprimez ce mot). La chose principale que je dois faire est de produire quelque chose s'il n'y a pas de correspondance. Par exemple, si aucun de ces mots n'est trouvé dans les dix premières lignes, il affichera UNKNOWN.

Je dois également limiter la sortie à la première correspondance, car je dois assurer une seule ligne de sortie par fichier d'entrée. Je peux le faire avec head ou poser une autre question si besoin est, je l'inclue seulement ici au cas où cela affecterait la sortie du texte sans correspondance.

Je ne suis pas non plus liée à awk en tant qu'outil - s'il existe une façon plus simple de le faire avec sed ou autre chose, je suis ouvert à cela.

+0

Avez-vous envisagé d'utiliser 'if-else'? Quelque chose comme - 'awk '{if ($ 0 ==" votre_match ") {print" match "} else {print" no match "}}'' – Bill

+0

Corrigez-moi si je me trompe, mais quand je l'ai regardé pour la première fois De cette façon, il semblait qu'il y aurait deux problèmes - d'abord je me retrouve avec un "match" ou "aucun match" pour chaque ligne que je touche, second je dois écrire le plein if-else pour tout le monde l'un des mots possibles (Ceux ci-dessus sont un sous-ensemble de ce qui sera finalement une très longue liste) - ce qui en fait une commande monstrueusement longue. Je peux également ne pas comprendre ce que vous suggérez (et ceci est donné que je changerais le 'si ($ 0 == ...' à 'if ($ 0 ~ ...') –

+0

@ ChrisO'Kelley Oui. Je peux adapter cela à vos besoins personnalisés, comme ne pas imprimer, ou faire d'autres choses que vous avez besoin.Mais il y a d'autres façons de le faire :) – Bill

Répondre

5

Vous avez juste besoin de sortir au premier match, ou sur la ligne 11 si aucune correspondance

awk ' 
    match($0,/(QUOTATION|TAX ... ORDER|STATEMENT)/) { 
     print substr($0,RSTART,RLENGTH) 
     exit 
    } 
    NR == 11 {print "UNKNOWN"; exit} 
' 
+0

qui est parfait, aussi cela explique une partie de la syntaxe de awk que j'ai été Je n'obtiens pas .. Je pense ('condition {action}') –

+0

Si vous omettez la condition, l'action sera exécutée pour chaque ligne Si vous omettez l'action, la valeur par défaut est 'print $ 0' si la condition est Vous verrez parfois la condition 'awk '{action} 1'' - le' 1' final est un raccourci pour '{print}' –

2

Vous pouvez le faire ..

(head -10 | egrep -o '(QUOTATION|TAX INVOICE|ADJUSTMENT NOTE| 
    DELIVERY DOCKET|PICKING SLIP|REMITTANCE ADVICE|PURCHASE ORDER|STATEMENT)' 
    || print "Unkownn") | head -1 
4

J'aime glenn jackman's réponse, cependant, si vous souhaitez imprimer des correspondances pour les 10 lignes, alors vous pouvez essayer quelque chose comme ceci:

awk ' 
match($0,/(QUOTATION|TAX ... ORDER|STATEMENT)/) { 
    print NR " ---> " substr($0,RSTART,RLENGTH) 
    flag=1 
} 
flag==0 && NR==11 { 
    print "UNKNOWN" 
    exit 
}' 
Questions connexes