Utilisation de awk pour imprimer toutes les colonnes de la nième de la dernière
Cette ligne a travaillé jusqu'à ce que j'avais espaces dans le deuxième champ.
svn status | grep '\!' | gawk '{print $2;}' > removedProjs
est-il un moyen de awk impression tout en de 2 $ou plus? ($3, $4.. jusqu'à ce que l'on n'a plus de colonnes?)
Je suppose que je dois ajouter que je suis en train de faire cela dans un environnement Windows avec Cygwin.
- En aparté, le
grep | awk
est un antipattern - vous souhaitezawk '/!/ { print $2 }'
- Unix "couper" est plus facile...
svn status | grep '\!' | cut -d' ' -f2- > removedProjs
- Double Possible de imprimer autres champs de la awk
- Je suis tellement heureux que vous avez mentionné ce - que je suis frustré de la voir partout!
Vous devez vous connecter pour publier un commentaire.
permet d'imprimer tous mais très première colonne:
imprime tous, mais les deux premières colonnes:
$1
pour tout ce que vous pourriez avoir besoin, avant de le changer.cat somefile
peut toujours être remplacé par< somefile
à la fin deawk
commandeawk '{$1=""; print substr($0,2)}' input_filename > output_filename
{2}
avec le{}
-joint certain nombre de précédents champs à éliminer; adapté de @savvadia réponse:awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}
cat somefile | awk '{$NF=""; print $0}'
$1=$2=$3=$4=$5=$6=$7=$8=""
awk -F, -vOFS=, '{$1=""; print $0}'
vous allez Vous retrouver avec un premier séparateur ($1
est toujours inclus, tout comme une chaîne vide). Vous pouvez bande avecsed
si:awk -F, -vOFS=, '{$1=""; print $0}' | sed 's/^,//'
awk '{$1=$2="\b"; print $0}' somefile
va retirer le premier espace blanc. Fonctionne avecawk '{$1=$2=$3=$4"\b"; print $0}' somefile
ainsiawk -F'-' 'BEGIN{OFS=FS};{$1=$2="\b"; print $0}'
Il y a une double question avec un plus simple la réponse à l'aide de coupe:
-d
spécifie le séparateur (espace),-f
spécifie la liste des colonnes (tous en commençant par le 2e)awk
version, il y a la ligne de mise en mémoire tampon des problèmes aveccut
, quiawk
n'ont pas: stackoverflow.com/questions/14360640/...awk
traite de multiples espaces adjacents caractères. comme un unique séparateur, tandis quecut
n'; aussi - bien que ce n'est pas un problème dans le cas de la main -cut
n'accepte qu'un seul littéral char. en tant que séparateur, tandis queawk
permet une regex.Vous pouvez utiliser une boucle for pour parcourir l'impression champs de $2 à $NF (intégré dans la variable qui représente le nombre de champs sur la ligne).
Edit:
Depuis "imprimer" permet d'ajouter un saut de ligne, vous aurez envie de tampon les résultats:
Vous pouvez également utiliser printf:
awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}'
ne fonctionne pas à tous. Utilisationawk '{out=""; for(i=2;i<=NF;i++){out=out" "$i}; print out}'
à la place.'{for(i=11;i<=NF-1;i++){printf "%s ", $i}; print $NF;}'
Pas de leader ou d'espaces.Ma réponse est basée sur l'un des VeeArr, mais j'ai remarqué qu'il a commencé avec un espace blanc avant d'imprimer la deuxième colonne (et le reste). Comme j'ai seulement 1 point de réputation, je ne peux pas commenter sur elle, alors là, il va comme un nouvel élément de réponse:
commencer avec "out" pour la seconde colonne, puis ajouter tous les autres colonnes (si elles existent). Cela va bien tant qu'il y a une deuxième colonne.
Personnellement, j'ai essayé toutes les réponses mentionnées ci-dessus, mais la plupart d'entre eux étaient un peu complexe, ou tout simplement pas droit. Le moyen le plus facile à faire à partir de mon point de vue est:
Où F" " définit le séparateur pour awk à utiliser. Dans mon cas, c'est l'espace, qui est aussi le séparateur par défaut pour awk. Cela signifie que-F" " peut être ignoré.
Où NF définit le nombre total de champs/colonnes. Donc la boucle va commencer à partir de la 4ème champ jusqu'à la dernière champ/colonne.
Où $N récupère la valeur de la Nième champ. Par conséquent print $je vais imprimer le champ/colonne en fonction basée sur le nombre de boucles.
La plupart des solutions avec awk laisser un espace. Les options ici d'éviter ce problème.
Option 1
Une coupe simple solution de (ne fonctionne qu'avec un seul délimiteurs):
Option 2
Forcer un awk re-calc parfois supprimer ajouté le leader de l'espace (OFS) laissé par la suppression du premier champs (fonctionne avec certaines versions de awk):
Option 3
L'impression de chaque champ formaté avec
printf
donnera plus de contrôle:Cependant, toutes les réponses changer tout répété FS entre les champs de l'OFS. Nous allons construire un couple d'option à ne pas le faire.
L'Option 4 (recommandé)
Une boucle avec des sous pour supprimer des champs et des séparateurs à l'avant.
Et en utilisant la valeur de FS au lieu de l'espace (qui peut être modifié).
Est plus portable, et ne donne pas lieu à un changement de FS à l'OFS:
REMARQUE: La
^[FS]*
est d'accepter une entrée avec de grands espaces.Option 5
Il est tout à fait possible de construire une solution qui n'ajoute pas extra (avant ou après) d'espaces, et de préserver les espaces existants(s) à l'aide de la fonction
gensub
de GNU awk, comme ceci:Il peut également être utilisé pour remplacer un groupe de champs, étant donné un nombre
n
:Bien sûr, dans ce cas, l'OFS est utilisé pour séparer les deux parties de la ligne, et l'espace de fin de la champs est toujours imprimé.
REMARQUE:
[FS]*
est utilisé pour permettre à des espaces dans la ligne de saisie.C'était irritant moi, je me suis assis et a écrit un
cut
-comme la spécification du champ de l'analyseur, testé avec GNU Awk 3.1.7.Tout d'abord, créez un nouveau Awk bibliothèque de script appelé
pfcut
, avec, par exemple,Ensuite, collez le script ci-dessous, et de les enregistrer. Après, c'est comment l'utilisation ressemble:
Pour éviter de taper tout ça, je suppose que le mieux qu'on puisse faire (voir autrement Charger automatiquement une fonction utilisateur au démarrage avec awk? - Unix & Linux Stack Exchange) est d'ajouter un alias à
~/.bashrc
; par exemple, avec:... alors vous pouvez simplement appeler:
Ici est la source de la
pfcut
script:cut
, pasawk
L'impression de colonnes à partir de #2 (la sortie n'aura pas de fuite d'espace au début):
+
après l'espace, depuis les champs peuvent être séparés par plus de 1 espace (awk
traite de plusieurs des espaces adjacents comme un seul séparateur). Aussi,awk
ignore les espaces de tête, de sorte que vous devriez commencer à la regex avec^[ ]*
. Avec un espace comme séparateur, on pourrait même généraliser la solution; par exemple, la suivante renvoie le tout à partir de la 3ème champ:awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}'
Il est plus difficile arbitraire de séparateurs de champ, si.Serait-ce de travailler?
Il laisse des espaces à l'avant si.
celui-ci utilise awk pour imprimer tous sauf le dernier champ
lauhub proposée est correcte, simple et rapide solution ici
C'est ce que j'ai préféré de toutes les recommandations:
L'impression à partir de la 6e à la dernière colonne.
ou
Si vous avez besoin de colonnes imprimées avec de l'arbitraire le délimiteur:
Donc si vous avez des espaces dans une colonne, il sera deux colonnes, mais vous pouvez vous connecter avec n'importe quel délimiteur ou sans elle.
Perl solution:
Ces options de ligne de commande sont utilisés:
-n
boucle autour de chaque ligne du fichier d'entrée, ne pas imprimer automatiquement chaque ligne-l
supprime les retours à la ligne avant le traitement, et ajoute dans de retour après-a
autosplit mode split lignes d'entrée dans le @F tableau. Par défaut, la séparation d'espaces-e
exécuter le code perlsplice @F,0,1
proprement supprime la colonne 0 de la @F tableaujoin " ",@F
rejoint les éléments de la @F tableau, à l'aide d'un espace entre chaque élémentPython solution:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file
Cela pourrait fonctionner si vous utilisez Bash et vous pouvez utiliser autant de " x " comme des éléments que vous voulez jeter, et il ignore les espaces multiples, si elles ne sont pas échappé.
Si vous ne voulez pas reformater la partie de la ligne que vous n'avez pas à couper, la meilleure solution je pense est écrit dans ma réponse:
Comment faire pour imprimer toutes les colonnes après un nombre donné à l'aide de awk?
Il côtelettes de ce qui est avant le champ nombre N, et imprime tous le reste de la ligne, y compris sur le terrain nombre N et le maintien de l'original de l'espacement (il n'a pas reformater). Il n'a pas mater si la chaîne de caractères du champ apparaît aussi quelque part d'autre dans la ligne.
Définir une fonction:
Et de l'utiliser comme ceci:
Sortie maintient tout, y compris les espaces de fin de
Dans vous cas particulier:
Si votre fichier/flux ne contient pas les caractères de nouvelle ligne dans le milieu de la ligne (vous pourriez être en utilisant un autre Séparateur d'Enregistrement), vous pouvez utiliser:
La première affaire échoue uniquement dans les fichiers/flux qui contiennent les rares hexadécimal nombre de caractères 1
Perl:
Ce
awk
fonction retourne la sous-chaîne de$0
qui comprend des champs debegin
àend
:Pour obtenir tout ce à partir de champ 3:
Pour obtenir la section de
$0
qui couvre les champs 3 à 5:b, e, p, i
non-sens en fonction du paramètre de la liste est juste unawk
façon de déclarer des variables locales.Je veux prolonger les propositions de réponses à la situation où les champs sont délimités par éventuellement plusieurs espaces –la raison pour laquelle l'OP n'est pas à l'aide de
cut
je suppose.Je sais que l'OP a demandé à propos de
awk
, mais unsed
approche pourrait fonctionner ici (exemple avec l'impression de colonnes à partir de la 5e à la dernière):pur sed approche
Explication:
s///
est utilisé de façon standard pour effectuer la substitution^\s*
correspond à l'un des espaces consécutifs au début de la ligne\S+\s+
moyen d'une colonne de données (non-blanc caractères suivie par des espaces caractères)(){4}
signifie que le motif est répété 4 fois.sed et couper
par tout simplement les remplacer consécutives espaces par un seul onglet;
tr et coupe:
tr
peut également être utilisé pour presser consécutives de caractères avec la-s
option.Awk exemples paraît complexe ici, ici, est simple shell Bash syntaxe:
Où
1
est votre nème colonne à compter à partir de 0.Exemple
Compte tenu de ce contenu de fichier (
in.txt
):voici le résultat:
Je n'étais pas heureux avec tout de la
awk
solutions présentées ici parce que je voulais extraire les quelques premières colonnes, puis imprimer le reste, je me suis donc tourné versperl
à la place. Le code suivant extrait les deux premières colonnes, et affiche le reste est:L'avantage par rapport à la
perl
solution de Chris Koknat est-ce vraiment uniquement les n premiers éléments sont séparés de la chaîne d'entrée; le reste de la chaîne n'est pas divisé à toutes et à cet effet, reste intacte. Mon exemple le démontre avec un mélange d'espaces et de tabulations.Pour modifier le nombre de colonnes à extraire, remplacer le
3
dans l'exemple avec n+1.de cette réponse n'est pas mauvais, mais le naturel, l'espacement est allé.
Veuillez alors le comparer à celui-ci:
Puis, vous verriez la différence.
Même
ls -la | awk '{$1=$2=""; print}'
qui est basé sur la réponse voté le meilleur à ce jour est de ne pas conserver la mise en forme.Donc je voudrais utiliser le suivant, et il permet aussi explicite sélective des colonnes dans le début:
Noter que chaque espace compte pour les colonnes trop, de sorte que, par exemple, dans le ci-dessous, les colonnes 1 et 3 sont vides, 2 est INFO et 4:
Si vous voulez du texte formaté, des chaînes de vos commandes avec echo et l'utilisation de 0 $pour imprimer le dernier champ.
Exemple:
Imprime:
En raison d'un mal plus upvoted réponse avec 340 voix, je viens de perdre 5 minutes de ma vie! Quelqu'un a-t essayer cette réponse avant de upvoting cela? Apparemment, non. Complètement inutile.
J'ai un journal, où, après de 5 $avec une adresse IP peut être plus de texte ou pas de texte. J'ai besoin de tout, à partir de l'adresse IP à la fin de la ligne devrait-il y avoir quoi que ce soit après $5. Dans mon cas, c'est effectivement rapproche d'un programme awk, pas un awk oneliner donc awk doit résoudre le problème. Lorsque j'essaie de supprimer les 4 premiers champs à l'aide de la plupart des upvoted mais complètement faux réponse:
il crache mauvais et inutile de réponse (j'ai ajouté [..] pour le démontrer):
Il y a même quelques suggestions pour combiner substr avec cette mauvaise réponse. Comme cette complication est une amélioration.
Au lieu de cela, si les colonnes sont de largeur fixe jusqu'à ce que le point de couper et de awk est nécessaire, la bonne réponse est:
qui produit le résultat désiré: