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
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 }'
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.)
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.-
, votre 7ème champ devient maintenant le 2ème champ.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.
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.