web-dev-qa-db-fra.com

Comment imprimer toutes les colonnes après un nombre particulier en utilisant awk?

Sur Shell, je crains de ne plus pouvoir utiliser une colonne en particulier.

Ceci affiche 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?

73
Lazer
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
75
Amadan

Lorsque vous souhaitez effectuer une plage de champs, awk ne dispose pas d'un moyen simple de le faire. Je recommanderais plutôt cut:

cut -d' ' -f 9- ./infile

Modifier

Ajout d'un séparateur de champ d'espace car le paramètre par défaut est un onglet. Merci à Glenn pour l'avoir signalé

55
SiegeX
awk '{print substr($0, index($0,$9))}'

Edit: Notez que cela ne fonctionne pas si un champ avant le neuvième contient la même valeur que le neuvième.

50
Ascherer
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-

Au lieu de traiter avec des espaces de largeur variable, remplacez tous les espaces par un seul espace. Puis utilisez simple cut avec les champs d’intérêt.

Il n'utilise pas awk, il n'est donc pas pertinent mais semble approprié compte tenu des autres réponses/commentaires.

10
Some Fool

Généralement, Perl remplace awk/sed/grep et. al., et est beaucoup plus portable (en plus d’être un meilleur canif).

Perl -lane 'print "@F[8..$#F]"'

Timtowtdi s'applique bien sûr.

7
bobbogo
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

Cela coupe ce qui se trouve avant le numéro de champ donné, N, et imprime tout le reste de la ligne, y compris le champ n.N et en maintenant l'espacement d'origine (il ne reformate pas). Peu importe que la chaîne du champ apparaisse également ailleurs dans la ligne, ce qui pose problème avec la réponse d'Ascherer.

Définir 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, la chaîne entière est renvoyée telle quelle, et pour n> NF, la chaîne vide.

2
Robert Vila
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
}
0
msol01
Ruby -lane 'print $F[3..-1].join(" ")' file
0
kurumi

Utilisez cut au lieu de awk et résolvez le problème avec la colonne de départ en utilisant la commande -c character cut.

Ici, je dis: donnez-moi tous, sauf les 49 premiers caractères de la sortie.

 ls -l /some/path/*/* | cut -c 50-

Le /*/*/ à la fin de la commande ls, dites-moi aussi ce qui se trouve dans les sous-répertoires.

Vous pouvez également extraire certaines plages de caractères ala (à partir de la page de manuel de cut). Par exemple, affichez les noms et les heures de connexion des utilisateurs actuellement connectés:

       who | cut -c 1-16,26-38
0
Joe

Voici un exemple de sortie ls -l:

-rwxr-----@ 1 ricky.john  1493847943   5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john  1493847943  27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john  1493847943  21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john  1493847943  10627144 Apr 16 14:09 03-Where to Get Help.mp4

Ma solution pour imprimer n'importe quoi après $9 Est awk '{print substr($0, 61, 50)}'

0
rickydj

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.

0