web-dev-qa-db-fra.com

Sélectionnez une colonne particulière en utilisant awk ou cut ou perl

Je dois sélectionner la 7e colonne dans un fichier délimité par des tabulations. par exemple:

cat filename | awk '{print $7}'

Le problème est que les données de la 4e colonne ont plusieurs valeurs avec un blanc entre les deux. exemple - La dernière ligne de la sortie ci-dessous:

user  \Adminis FL_vol Design         0         -       1       -
group        0 FL_vol Design   19324481         -    3014       -
user      \MAK FL_vol Design   16875161         -    2618       -
tree       826 FL_vol Out Global Doc Mark     16875162         -    9618       - /vol/FL_vol/Out Global Doc Mark
16
javed

Si les données sont séparées par des tabulations sans ambiguïté, alors cut coupera les tabulations, pas les espaces:

cut -f7 filename

Vous pouvez certainement le faire aussi avec awk:

awk -F'\t' '{ print $7 }'
18
tripleee

Si les champs sont séparés par des tabulations et que votre souci est que certains champs contiennent des espaces, il n'y a pas de problème ici, juste:

cut -f 7

(couper par défaut les champs délimités par des tabulations.)

5
ysth

A en juger par le format de votre fichier d'entrée, vous pouvez vous en sortir en délimitant sur - au lieu d'espaces:

awk 'BEGIN{FS="-"} {print $2}' filename
  • FS signifie Séparateur de champs, pensez-y simplement comme le délimiteur d'entrée.
  • Étant donné que nous délimitons maintenant sur -, votre 7ème champ devient maintenant le 2ème champ.
  • Sauvez un chat ! Spécifiez le fichier d'entrée filename comme argument à awk à la place.

Alternativement, si vos champs de données sont séparés par des onglets, vous pouvez le faire plus explicitement comme suit:

awk 'BEGIN{FS="\t"} {print $7}' filename

Et cela résoudra le problème puisque Out Global Doc Mark semble être séparé par des espaces.

2
sampson-chen

Cela pourrait fonctionner pour vous (GNU sed):

sed -r 's/(([^\t]*)\t?){7}.*/\2/' file

Cette commande de remplacement sélectionne tout dans la ligne et renvoie le 7e non-tab. Dans sed la dernière chose regroupée par (...) sera retourné dans la partie gauche de la substitution en utilisant une référence arrière. Dans ce cas, la première référence arrière retournerait à la fois les caractères non tabulés et le caractère tabulé (si présent N.B. le ? méta-caractère qui correspond à l'un ou à l'autre du schéma de progression) .Le .* engloutit simplement ce qui restait sur la ligne, le cas échéant.

1
potong