J'ai besoin d'aide pour comprendre comment utiliser la commande sed pour afficher uniquement la première et la dernière colonne d'un fichier texte. Voici ce que j'ai jusqu'à présent pour la colonne 1:
cat logfile | sed 's/\|/ /'|awk '{print $1}'
Ma faible tentative pour que la dernière colonne s'affiche également était:
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
Cependant, cela prend la première colonne et la dernière colonne et les fusionne dans une liste. Existe-t-il un moyen d'imprimer clairement la première colonne et les dernières colonnes avec les commandes sed et awk?
Exemple d'entrée:
foo|dog|cat|mouse|lion|ox|tiger|bar
Réponses:
Presque là. Placez simplement les deux références de colonne l'une à côté de l'autre.
Notez également que vous n'avez pas besoin
cat
ici.Notez également que vous pouvez dire
awk
que les séparateurs de colonnes sont|
, au lieu de blancs, vous n'avez donc pas besoin nonsed
plus.Selon les suggestions de Caleb , si vous voulez une solution qui génère toujours le dernier champ, même s'il n'y en a pas exactement huit, vous pouvez l'utiliser
$NF
.De plus, si vous souhaitez que la sortie conserve les
|
séparateurs, au lieu d'utiliser un espace, vous pouvez spécifier les séparateurs de champ de sortie. Malheureusement, c'est un peu plus maladroit que de simplement utiliser le-F
drapeau, mais voici trois approches.Vous pouvez affecter les séparateurs de champs d'entrée et de sortie en eux-
awk
mêmes, dans le bloc BEGIN.Vous pouvez affecter ces variables lors d'un appel à
awk
partir de la ligne de commande, via l'-v
indicateur.ou simplement:
la source
|
comme séparateur de sortie au lieu de l'espace par défaut pour la concaténation de chaînes. Vous pouvez également expliquer l'utilisation$NF
au lieu du codage en dur$8
pour obtenir la dernière colonne.Remplacez simplement du premier au dernier
|
par un|
(ou un espace si vous préférez):Notez que bien qu'il n'y ait pas d'
sed
implémentation où|
est spécial (tant que les expressions régulières étendues ne sont pas activées via-E
ou-r
dans certaines implémentations),\|
elle-même est spéciale dans certains comme GNUsed
. Vous ne devez donc pas vous échapper|
si vous voulez qu'il corresponde au|
personnage.Si le remplacement par de l'espace et si l'entrée peut déjà contenir des lignes avec une seule
|
, alors, vous devrez traiter cela spécialement comme|.*|
ne correspondra pas à ceux-ci. Cela pourrait être:(c'est-à-dire rendre la
.*|
pièce facultative) Ou:ou:
Si vous voulez les premier et huitième champs quel que soit le nombre de champs dans l'entrée, alors c'est juste:
(tous ceux-ci fonctionneraient avec n'importe quel utilitaire compatible POSIX en supposant que l'entrée forme du texte valide (en particulier,
sed
ceux-ci ne fonctionneront généralement pas si l'entrée contient des octets ou des séquences d'octets qui ne forment pas de caractères valides dans les paramètres régionaux actuels comme par exempleprintf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
dans une locale UTF-8)).la source
Vous utilisez
awk
quand même:la source
|
plutôt cet espace) avec-F\|
ou similaire? Et s'il voulait utiliser le même délimiteur pour la sortie?Si vous vous retrouvez sans gêne ni séduction, vous pouvez obtenir la même chose avec coreutils:
la source
cut
est plus propre et plus compact que awk / sed lorsque vous êtes juste intéressé par la première colonne, ou si les délimètres sont fixes (c'est-à-dire pas un nombre variable d'espaces).Il semble que vous essayez d'obtenir les premier et dernier champs de texte délimités par
|
.J'ai supposé que votre fichier journal contient le texte ci-dessous,
Et vous voulez la sortie comme,
Si oui, alors voici la commande pour la vôtre
Grâce à GNU sed,
Exemple:
la source
Vous devriez probablement le faire avec
sed
- je le ferais de toute façon - mais, juste parce que personne n'a encore écrit celui-ci:SORTIE
la source