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?
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
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
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é
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.
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.
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.
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.
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
}
Ruby -lane 'print $F[3..-1].join(" ")' file
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
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)}'
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.