J'essaie d'extraire un certain (le quatrième) champ du flux de texte ajusté en fonction de l'espace. J'essaie d'utiliser la cut
commande de la manière suivante:
cat text.txt | cut -d " " -f 4
Malheureusement, cut
ne traite pas plusieurs espaces comme un délimiteur. J'aurais pu passer à travers awk
awk '{ printf $4; }'
ou sed
sed -E "s/[[:space:]]+/ /g"
pour réduire les espaces, mais j'aimerais savoir s'il existe un moyen de gérer cut
et plusieurs délimiteurs en natif?
Réponses:
Essayer:
Depuis la
tr
page de manuel:la source
cat
ici. Vous pouvez passer< text.txt
directement àtr
. en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat-d
et traduire directement de plusieurs caractères à l'onglet. Par exemple: Je suis venu ici à la recherche d'un moyen d'exporter automatiquement mon affichage:who am i | tr -s ' ()' '\t' | cut -f5
echo "a b c" | cut -d " " -f2-
,echo "a b c" | tr -s " " | cut -d " " -f2-
Comme vous le dites dans votre question,
awk
c'est vraiment la voie à suivre. Utilisercut
est possible avectr -s
pour serrer les espaces, comme le montre la réponse de kev .Permettez-moi cependant de passer en revue toutes les combinaisons possibles pour les futurs lecteurs. Les explications se trouvent dans la section Test.
tr | Couper
awk
frapper
sed
Les tests
Compte tenu de ce fichier, testons les commandes:
tr | Couper
awk
frapper
Cela lit les champs de manière séquentielle. En utilisant,
_
nous indiquons qu'il s'agit d'une variable jetable en tant que "variable indésirable" pour ignorer ces champs. De cette façon, nous stockons en$myfield
tant que 4ème champ dans le fichier, peu importe les espaces entre eux.sed
Cela attrape trois groupes d'espaces et aucun espace avec
([^ ]*[ ]*){3}
. Ensuite, il attrape tout ce qui arrive jusqu'à un espace comme le 4ème champ, avec lequel il est finalement imprimé\1
.la source
awk
n'est pas seulement élégant et simple, il est également inclus dans VMware ESXi, où iltr
manque.awk
!read
commande, si nous ne nous soucions pas de ce qu'il contient . Cela peut être n'importe quoi, c'est juste que cela est devenu en quelque sorte standard au lieu dejunk_var
ouwhatever
:)solution la plus courte / la plus conviviale
Après avoir été frustré par les trop nombreuses limitations de
cut
, j'ai écrit mon propre remplacement, que j'ai appelécuts
à "couper les stéroïdes".Les coupes fournissent ce qui est probablement la solution la plus minimaliste à cela et à de nombreux autres problèmes de couper / coller.
Un exemple, parmi tant d'autres, abordant cette question particulière:
cuts
les soutiens:paste
séparément)et beaucoup plus. Aucun n'est fourni par la norme
cut
.Voir aussi: https://stackoverflow.com/a/24543231/1296044
Source et documentation (logiciel gratuit): http://arielf.github.io/cuts/
la source
Ce Perl one-liner montre à quel point Perl est lié à awk:
Cependant, le
@F
tableau autosplit commence à l'index$F[0]
tandis que les champs awk commencent par$1
la source
Avec les versions que
cut
je connais, non, ce n'est pas possible.cut
est principalement utile pour analyser des fichiers où le séparateur n'est pas un espace (par exemple/etc/passwd
) et qui ont un nombre fixe de champs. Deux séparateurs d'affilée signifient un champ vide, et cela vaut également pour les espaces blancs.la source