Cette ligne a fonctionné jusqu'à ce que j'aie un espace dans le deuxième champ.
svn status | grep '\!' | gawk '{print $2;}' > removedProjs
Existe-t-il un moyen pour que awk imprime tout en 2 $ ou plus? (3 $, 4 $ .. jusqu'à ce que nous n'ayons plus de colonnes?)
Je suppose que je devrais ajouter que je fais cela dans un environnement Windows avec Cygwin.
grep | awk
awk '/!/ { print $2 }'
svn status | grep '\!' | cut -d' ' -f2- > removedProjs
Réponses:
imprimera tout sauf la toute première colonne:
affichera toutes les colonnes sauf deux:
la source
awk '{$1=""; print substr($0,2)}' input_filename > output_filename
awk -F, -vOFS=, '{$1=""; print $0}'
vous vous retrouverez avec un délimiteur initial ($1
est toujours inclus, tout comme une chaîne vide). Vous pouvez retirer cela avecsed
cependant:awk -F, -vOFS=, '{$1=""; print $0}' | sed 's/^,//'
Il y a une question en double avec une réponse plus simple en utilisant cut:
-d
spécifie le délimètre (espace) ,-f
spécifie la liste des colonnes (toutes commençant par la 2e)la source
awk
version, il y a des problèmes de mise en mémoire tampon de ligne aveccut
, quiawk
n'ont pas: stackoverflow.com/questions/14360640/…awk
traite plusieurs caractères d'espace adjacents. comme un seul séparateur, tandiscut
que non; aussi - bien que ce ne soit pas un problème dans le cas présent -cut
n'accepte qu'un seul caractère littéral. comme délimiteur, alors queawk
permet une expression régulière.Vous pouvez utiliser une boucle for pour parcourir les champs d'impression de 2 $ à $ NF (variable intégrée qui représente le nombre de champs sur la ligne).
Edit: Puisque "print" ajoute une nouvelle ligne, vous voudrez tamponner les résultats:
Vous pouvez également utiliser printf:
la source
'{for(i=11;i<=NF-1;i++){printf "%s ", $i}; print $NF;}'
pas d'espaces de début ou de fin.Ma réponse est basée sur celle de VeeArr , mais j'ai remarqué qu'elle commençait par un espace blanc avant d'imprimer la deuxième colonne (et le reste). Comme je n'ai qu'un point de réputation, je ne peux pas le commenter, alors voici une nouvelle réponse:
commencez par "out" comme deuxième colonne, puis ajoutez toutes les autres colonnes (si elles existent). Cela va bien tant qu'il y a une deuxième colonne.
la source
La plupart des solutions avec awk laissent un espace. Les options ici évitent ce problème.
Option 1
Une solution de découpe simple (ne fonctionne qu'avec des délimiteurs simples):
Option 2
Forcer un re-calc awk supprime parfois l'espace de tête (OFS) ajouté en supprimant les premiers champs (fonctionne avec certaines versions d'awk):
Option 3
L'impression de chaque champ formaté avec
printf
donnera plus de contrôle:Cependant, toutes les réponses précédentes changent tous les FS répétés entre les champs en OFS. Construisons quelques options qui ne le font pas.
Option 4 (recommandée)
Une boucle avec sub pour supprimer les champs et délimiteurs à l'avant.
Et en utilisant la valeur de FS au lieu de l'espace (qui pourrait être modifié).
Est -ce plus facile à transporter et ne déclenche pas un changement de FS à BSF: NOTE: Le
^[FS]*
est d'accepter une entrée par des espaces.Option 5
Il est tout à fait possible de créer une solution qui n'ajoute pas d'espaces supplémentaires (de début ou de fin) et de conserver les espaces existants en utilisant la fonction
gensub
de GNU awk, comme ceci:Il peut également être utilisé pour échanger un groupe de champs en fonction d'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 blanc de fin des champs est toujours imprimé.
REMARQUE:
[FS]*
est utilisé pour autoriser les espaces de tête dans la ligne d'entrée.la source
J'ai personnellement essayé toutes les réponses mentionnées ci-dessus, mais la plupart d'entre elles étaient un peu complexes ou tout simplement pas correctes. La façon la plus simple de le faire de mon point de vue est:
Où -F "" définit le délimiteur à utiliser par awk. Dans mon cas, c'est l'espace, qui est également le délimiteur par défaut pour awk. Cela signifie que -F "" peut être ignoré.
Où NF définit le nombre total de champs / colonnes. Par conséquent, la boucle commencera du 4ème champ jusqu'au dernier champ / colonne.
Où $ N récupère la valeur du champ Nth. Par conséquent, imprimer $ i imprimera le champ / la colonne en cours en fonction du nombre de boucles.
la source
lauhub a proposé ce correct, simple et rapide solution ici
la source
Cela m'irritait tellement, je me suis assis et j'ai écrit un
cut
analyseur de spécifications de champ semblable à celui testé avec GNU Awk 3.1.7.Tout d'abord, créez un nouveau script de bibliothèque Awk appelé
pfcut
, avec par exempleEnsuite, collez le script ci-dessous et enregistrez. Après cela, voici à quoi ressemble l'utilisation:
Pour éviter de taper tout cela, je suppose que la meilleure chose à faire (voir sinon 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:
Voici la source du
pfcut
script:la source
cut
, pasawk
Impression des colonnes à partir de # 2 (la sortie n'aura pas d'espace de fin au début):
la source
+
après l'espace, car les champs peuvent être séparés par plus d'un espace (awk
traite plusieurs espaces adjacents comme un seul séparateur). Ignore également lesawk
espaces de début, vous devez donc commencer l'expression régulière avec^[ ]*
. Avec l'espace comme séparateur, vous pouvez même généraliser la solution; Par exemple, ce qui suit renvoie tout à partir du 3ème champ:awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}'
Cela devient cependant plus délicat avec des séparateurs de champs arbitraires.Est-ce que cela fonctionnerait?
Il laisse cependant un espace devant.
la source
celui-ci utilise awk pour tout imprimer sauf le dernier champ
la source
C'est ce que j'ai préféré de toutes les recommandations:
Impression de la 6e à la dernière colonne.
ou
la source
Si vous avez besoin de colonnes spécifiques imprimées avec un délimiteur arbitraire:
Donc, si vous avez un espace dans une colonne, ce sera deux colonnes, mais vous pouvez le connecter avec n'importe quel délimiteur ou sans lui.
la source
Solution Perl:
Ces options de ligne de commande sont utilisées:
-n
boucle autour de chaque ligne du fichier d'entrée, n'imprime pas automatiquement chaque ligne-l
supprime les nouvelles lignes avant le traitement et les ajoute à nouveau après-a
mode autosplit - divise les lignes d'entrée dans le tableau @F. Par défaut, la division sur un espace blanc-e
exécuter le code perlsplice @F,0,1
supprime proprement la colonne 0 du tableau @Fjoin " ",@F
joint les éléments du tableau @F, en utilisant un espace entre chaque élémentSolution Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file
la source
Si vous ne voulez pas reformater la partie de la ligne que vous ne coupez pas, la meilleure solution à laquelle je peux penser est écrite dans ma réponse:
Comment imprimer toutes les colonnes après un numéro particulier en utilisant awk?
Il coupe ce qui est avant le numéro de champ N donné et imprime tout le reste de la ligne, y compris le numéro de champ N 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.
Définissez une fonction:
Et utilisez-le comme ceci:
La sortie conserve tout, y compris les espaces de fin
Dans votre cas particulier:
Si votre fichier / flux ne contient pas de caractères de nouvelle ligne au milieu des lignes (vous pourriez utiliser un séparateur d'enregistrement différent), vous pouvez utiliser:
Le premier cas échouera uniquement dans les fichiers / flux contenant le caractère hexadécimal rare numéro 1
la source
Cela fonctionnerait si vous utilisez Bash et vous pouvez utiliser autant de «x» que d'éléments que vous souhaitez supprimer et il ignore plusieurs espaces s'ils ne sont pas échappés.
la source
Perl:
la source
Cette
awk
fonction renvoie une sous-chaîne$0
qui inclut les champs debegin
àend
:Pour tout obtenir à partir du champ 3:
Pour obtenir une section
$0
qui couvre les champs 3 à 5:b, e, p, i
un non-sens dans la liste des paramètres de fonction est juste unawk
moyen de déclarer des variables locales.la source
Je veux étendre les réponses proposées à la situation où les champs sont délimités par peut-être plusieurs espaces blancs - la raison pour laquelle l'OP n'utilise pas,
cut
je suppose.Je sais que l'OP a posé des questions
awk
, mais unesed
approche fonctionnerait ici (exemple avec l'impression de colonnes du 5 au dernier):approche sed pure
Explication:
s///
est utilisé de manière standard pour effectuer la substitution^\s*
correspond à tout espace blanc consécutif au début de la ligne\S+\s+
signifie une colonne de données (caractères non blancs suivis de caractères blancs)(){4}
signifie que le motif est répété 4 fois.sed et cut
en remplaçant simplement les espaces blancs consécutifs par un seul onglet;
tr et cut:
tr
peut également être utilisé pour presser des caractères consécutifs avec l'-s
option.la source
Les exemples awk semblent complexes ici, voici la syntaxe simple du shell Bash:
Où
1
est votre n ième colonne à partir de 0.Exemple
Compte tenu de ce contenu de fichier (
in.txt
):voici la sortie:
la source
Je n'étais pas satisfait de l'une des
awk
solutions présentées ici parce que je voulais extraire les premières colonnes puis imprimer le reste, alors je me suis tourné vers laperl
place. Le code suivant extrait les deux premières colonnes et affiche le reste tel quel:L'avantage par rapport à la
perl
solution de Chris Koknat est qu'en réalité, seuls 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 du tout divisé et reste donc complètement intact. Mon exemple le démontre avec un mélange d'espaces et de tabulations.Pour modifier le nombre de colonnes à extraire, remplacez le
3
dans l'exemple par n + 1.la source
de cette réponse n'est pas mauvais mais l'espacement naturel a disparu.
Veuillez ensuite le comparer à celui-ci:
Vous verriez alors la différence.
Même
ls -la | awk '{$1=$2=""; print}'
ce qui est basé sur la réponse la mieux votée jusqu'à présent ne préserve pas la mise en forme.Ainsi, j'utiliserais ce qui suit, et cela permet également des colonnes sélectives explicites au début:
Notez que chaque espace compte également pour les colonnes, donc par exemple dans ce qui suit, les colonnes 1 et 3 sont vides, 2 est INFO et 4 est:
la source
Si vous voulez du texte formaté, enchaînez vos commandes avec écho et utilisez $ 0 pour imprimer le dernier champ.
Exemple:
Tirages:
la source
À cause d'une mauvaise réponse la plus votée avec 340 votes, je viens de perdre 5 minutes de ma vie! Quelqu'un at-il essayé cette réponse avant de voter pour cela? Apparemment non. Complètement inutile.
J'ai un journal où après 5 $ avec une adresse IP peut être plus de texte ou pas de texte. J'ai besoin de tout, de l'adresse IP à la fin de la ligne, s'il y a quelque chose après 5 $. Dans mon cas, il s'agit en fait d'un programme awk, pas d'un awel oneliner, donc awk doit résoudre le problème. Lorsque j'essaie de supprimer les 4 premiers champs en utilisant la réponse la plus élevée mais complètement incorrecte:
il crache une réponse fausse et inutile (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 ont une largeur fixe jusqu'à ce que le point de coupure et awk soient nécessaires, la bonne réponse est:
qui produit la sortie souhaitée:
la source