2009-04-02 13 views
2

Je veux sortie top 10 lignes de commande AWK dans la liste des fichiers donnés par trouver, en utilisant cet extrait:Application Head Unix sur AWK travers commande Rechercher

$ find . -name "*.txt" -print -exec awk '$9 != ""' \| head -n10 {} \; 

Notez aussi que je veux imprimer les noms de fichiers en cours de traitement.

Mais pourquoi je reçois cette erreur:

awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory) 
./myfile.txt 

Quelle est la bonne façon de le faire?

J'ai essayé sans antislash avant le tuyau. Néanmoins, il a donné une erreur:

find: missing argument to `-exec' 
head: cannot open `{}' for reading: No such file or directory 
head: cannot open `;' for reading: No such file or directory 
+0

Veuillez clarifier ce que vous essayez de faire. Il semble que vous essayez de réaliser deux choses à la fois. –

+0

@YuvalF: 1. Avec AWK, filtrez les lignes contenant "" dans la 9e colonne; 2. Afficher seulement les 10 premières lignes - après le filtre. – neversaint

+0

Essayez ma solution mise à jour. –

Répondre

3

Si vous voulez exécuter un programme awk sur tous les fichiers de constater que seulement imprime les 10 premières lignes chaque fois.

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \; 
1

Vous pouvez le faire de cette façon aussi:

find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {} \; 

sans head.

+0

@Zsolt: J'ai essayé. Pour chaque fichier, votre extrait continue même après la 10ème ligne. – neversaint

+0

@Zsolt: merci. Comment puis-je le faire pour imprimer le nom de fichier étant (en tant que délimiteur) aussi? – neversaint

4

Lors de l'exécution d'une commande avec -exec de find, vous n'obtenez pas toutes les bonnes choses shell comme l'opérateur de tuyau (|). Vous pouvez les récupérer en exécutant explicitement un sous-shell si vous le souhaitez, par exemple:

find. -name '* .txt' -exec/bin/sh -c "renvoie un fichier texte appelé {} | head -n 15" \;

1

En utilisant awk ne devrait fonctionner:

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \; 
+0

@mouviciel: merci. Comment puis-je le faire pour imprimer le nom de fichier en cours de traitement également? – neversaint

+0

C'est le cas: ceci est l'indicateur -print de votre commande find. – mouviciel

+0

@mouviciel: merci, compris. – neversaint

2

Sur la base de la réponse de Ashawley:

find . -name "*.txt" -print -exec awk '$9 != "" {print; if(NR > 9) exit; }' {} \; 

Il devrait mieux fonctionner, que nous abandonnerons awk après le 10 enregistrement.

+0

Il sort après le dixième record, mais pas après la dixième ligne imprimée qui est ce que l'OP voulait et la réponse d'ashawley fournit. –