J'essaie de supprimer les deux premières colonnes (qui ne m'intéressent pas) d'un fichier journal DbgView. Je n'arrive pas à trouver un exemple qui imprime à partir de la colonne 3 jusqu'à la fin de la ligne. Notez que chaque ligne a un nombre variable de colonnes.
linux
shell
unix
multiple-columns
Amit G
la source
la source
Réponses:
... ou une solution plus simple:
cut -f 3- INPUTFILE
ajoutez simplement le séparateur correct (-d) et vous obtenez le même effet.la source
la source
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
(printf
n'imprimera pas le caractère de nouvelle ligne alors queprint ""
j'ajouterai une nouvelle ligne après que les autres champs aient été imprimés)echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, ce qui donne:3 4 5 6 7 8 9 10
.solution trouvée ici:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
la source
La réponse de Jonathan Feinberg imprime chaque champ sur une ligne distincte. Vous pouvez utiliser
printf
pour reconstruire l'enregistrement pour une sortie sur la même ligne, mais vous pouvez également simplement déplacer les champs d'un saut vers la gauche.la source
NF
n'est pas autorisée par POSIX.NF
décrémenter.NB: cette méthode laissera des "blancs" dans les champs 1,2,3 mais pas de problème si vous voulez juste regarder la sortie.
la source
1
? avec quel mot clé dois-je rechercherawk
?{$1=$2=$3="";$0=$0;$1=$1}1
Si vous souhaitez imprimer les colonnes après le 3 par exemple dans la même ligne, vous pouvez utiliser:
Par exemple:
Il imprimera:
Comme nous pouvons le voir, la fiche de paie, même avec un espace, apparaît dans la ligne correcte.
la source
Qu'en est-il de la ligne suivante:
Basé sur la suggestion de @ ghostdog74. Le mien devrait mieux se comporter lorsque vous filtrez les lignes, c'est-à-dire:
la source
sed 's/\s\+//g'
à la fin de la commande pour couper les espaces deCela coupe ce qui se trouve avant le champ nr., N 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 de daisaa.
Définissez une fonction:
Et utilisez-le comme ceci:
La sortie conserve tout, y compris les espaces de fin
Fonctionne bien pour les fichiers où «/ n» est le séparateur d'enregistrement afin que vous n'ayez pas ce caractère de nouvelle ligne à l'intérieur des lignes. Si vous souhaitez l'utiliser avec d'autres séparateurs d'enregistrement, utilisez:
par exemple. Fonctionne bien avec presque tous les fichiers tant qu'ils n'utilisent pas de caractères hexadécimaux. 1 à l'intérieur des lignes.
la source
La commande awk suivante imprime les N derniers champs de chaque ligne et à la fin de la ligne imprime un nouveau caractère de ligne:
Trouvez ci-dessous un exemple qui répertorie le contenu du répertoire / usr / bin, puis contient les 3 dernières lignes, puis imprime les 4 dernières colonnes de chaque ligne en utilisant awk:
la source
Vous trouvez d'abord la position du début de la troisième colonne. Avec substr, vous imprimerez la ligne entière ($ 0) en commençant à la position (dans ce cas a) jusqu'à la fin de la ligne.
la source
Eh bien, vous pouvez facilement obtenir le même effet en utilisant une expression régulière. En supposant que le séparateur est un espace, cela ressemblerait à:
la source
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
qui enlève le motif deux fois.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 rajoute par la suite-a
mode autosplit - divise les lignes d'entrée dans le tableau @F. Par défaut, diviser sur les espaces-e
exécuter le code perlsplice @F,0,2
supprime proprement les colonnes 0 et 1 du tableau @Fjoin " ",@F
joint les éléments du tableau @F, en utilisant un espace entre chaque élémentSi votre fichier d'entrée est délimité par des virgules, plutôt que par des espaces, utilisez
-F, -lane
Solution Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
la source
Un peu tard ici, mais rien de ce qui précède ne semblait fonctionner. Essayez ceci, en utilisant printf, insère des espaces entre chacun. J'ai choisi de ne pas avoir de nouvelle ligne à la fin.
la source
imprime les enregistrements commençant du 4e champ au dernier champ dans le même ordre qu'ils étaient dans le fichier d'origine
la source
Dans Bash, vous pouvez utiliser la syntaxe suivante avec des paramètres de position:
En savoir plus: Gestion des paramètres de position sur le wiki Bash Hackers
la source
S'il ne s'agit que d'ignorer les deux premiers champs et si vous ne voulez pas d'espace pour masquer ces champs (comme le font certaines des réponses ci-dessus):
la source
Les deux premières colonnes sont effacées,
sed
supprime les espaces de début.la source
Dans AWK, les colonnes sont appelées champs, donc NF est la clé
toutes les lignes:
première ligne uniquement:
la source