2009-09-25 9 views
2

Si les lignes de texte de largeur indéterminée avaient dans un dossier avait texte « Ligne à Réorganiser », et je voulais seulement retourner et afficher l'ordre des trois premiers jetons que je peux faire:Comment puis-je sélectivement activer une chaîne?

# cat file.txt | awk '/Line-to-reorder/ { print $3 $2 $1 }' 

Comment Je laisse les lignes de texte qui n'ont pas les critères correspondants passer inaltérées? Deuxièmement, comment puis-je afficher le reste des jetons (le reste de la ligne) sur la ligne correspondante?

(awk est l'outil de choix depuis ma mise en œuvre de busybox du système embarqué a.)

Répondre

3

Ce script simple répond à vos deux questions:

awk '/Line-to-reorder/ {tmp = $1; $1 = $3; $3 = tmp} {print}' file.txt 
  • vous pouvez attribuer aux champs à modifier la ligne
  • pas besoin de cat
  • impression (tous les champs de) chaque ligne
+0

Mieux encore. Merci. – Jamie

+0

peut le jouer un peu: 'awk '/ Line-to-reorder/{tmp = $ 1; 1 $ = 3 $; $ 3 = tmp} 1 'fichier.txt' –

1
meilleure option

est probablement correspondre à toutes les lignes (sans motif) et ne if ... else dans l'action.

quelque chose comme

{ 
if ($0 ~ /Line-to-reorder/) 
    print $3 $2 $1 
else 
    print $0 
} 
+0

Encore mieux. bien que je devais faire: if ($ 0 ~/Line-to-reorder /) {print $ 3 $ 2 $ 1} autre {print $ 0}} – Jamie

2

Il n'est pas nécessaire de faire une if...else, juste faire un match/non match.

Ceci imprime les champs 3, 2 et 1 suivi du reste des champs dans leur ordre d'origine si la ligne correspond. Si ce n'est pas le cas, il imprime la ligne entière telle quelle.

awk '/Line-to-reorder/ {printf "%s %s %s", $3, $2, $1; for (i=4; i<=NF; i++) {printf " %s", $i }; printf "\n"} !/Line-to-reorder/ {print}' file.txt 

éclaté dans un script awk:

#!/usr/bin/awk -f 
/Line-to-reorder/ { 
     printf "%s %s %s", $3, $2, $1 
     for (i=4; i<=NF; i++) { 
       printf " %s", $i 
     } 
     printf "\n" 
} 
!/Line-to-reorder/ {print} 

Exécuter ce avec quelque chose comme:

awkscript file.txt 

Ce script awk prend un nom de fichier comme argument (parce que awk DOE) et ainsi cat n'est pas nécessaire pour l'une ou l'autre méthode d'appel.

+0

+1 - J'y suis revenu comme une référence utile. Merci. – Jamie

Questions connexes