Sur shell, je passe à awk lorsque j'ai besoin d'une colonne particulière.
Cela imprime la colonne 9, par exemple:
... | awk '{print $9}'
Comment puis-je dire à awk d'imprimer toutes les colonnes, y compris et après la colonne 9 , pas seulement la colonne 9?
Réponses:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
la source
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
ouperl
pour cela. N'utilisez cela que si vous insistez vraiment pour l'avoirawk
.Lorsque vous voulez faire une gamme de champs,
awk
vous n'avez pas vraiment de moyen simple de le faire. Je recommanderaiscut
plutôt:cut -d' ' -f 9- ./infile
Éditer
Ajout d'un délimiteur de champ d'espace car la valeur par défaut est un onglet. Merci à Glenn pour l'avoir signalé
la source
find . | xargs ls -l | cut -d' ' -f 9-
. Pour une raison quelconque, les espaces doubles sont également comptés. Exemple:lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
aboutira à./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Modifier : Notez que cela ne fonctionne pas si un champ avant le neuvième contient la même valeur que le neuvième.
la source
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Au lieu de traiter des espaces de largeur variable, remplacez tous les espaces par un seul espace. Ensuite, utilisez simple
cut
avec les champs d'intérêt.Il n'utilise pas awk donc n'est pas pertinent mais semble approprié compte tenu des autres réponses / commentaires.
la source
ps faux |
utilisation. N'ayez jamais peur d'admettre que l'outil XYZ n'est pas le plus approprié.Généralement, perl remplace awk / sed / grep et. al., et est beaucoup plus portable (en plus d'être simplement un meilleur canif).
perl -lane 'print "@F[8..$#F]"'
Timtowtdi s'applique bien sûr.
la source
-l
ou ajouter\n
à l'instruction d'impression.awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Cela coupe ce qui est avant le champ nr., N donné et imprime tout le reste de la ligne, y compris le champ nrN et en conservant l'espacement d'origine (il ne reformate pas). Cela n'a pas d'importance si la chaîne du champ apparaît également ailleurs dans la ligne, ce qui est le problème avec la réponse d'Ascherer.
Définissez une fonction:
fromField () { awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}' }
Et utilisez-le comme ceci:
$ echo " bat bi iru lau bost " | fromField 3 iru lau bost $ echo " bat bi iru lau bost " | fromField 2 bi iru lau bost
La sortie conserve tout, y compris les espaces de fin Pour N = 0, elle renvoie la ligne entière, telle quelle, et pour n> NF la chaîne vide
la source
Voici un exemple de
ls -l
sortie:Ma solution pour imprimer quoi que ce soit après
$9
estawk '{print substr($0, 61, 50)}'
la source
ruby -lane 'print $F[3..-1].join(" ")' file
la source
Pour afficher les 3 premiers champs et imprimer les champs restants, vous pouvez utiliser:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
où $ 1 $ 2 $ 3 sont les 3 premiers champs.
la source
function print_fields(field_num1, field_num2){ input_line = $0 j = 1; for (i=field_num1; i <= field_num2; i++){ $(j++) = $(i); } NF = field_num2 - field_num1 + 1; print $0 $0 = input_line }
la source
Utiliser couper au lieu de awk et résoudre les problèmes de détermination de la colonne à partir de laquelle commencer en utilisant la commande -c character cut.
Ici, je dis, donnez-moi tous sauf les 49 premiers caractères de la sortie.
le
/*/*/
à la fin de la commande ls indique: montrez-moi aussi ce qu'il y a dans les sous-répertoires.Vous pouvez également extraire certaines plages de caractères ala (à partir de la page de manuel cut). Par exemple, affichez les noms et les heures de connexion des utilisateurs actuellement connectés:
la source