Le terme "champ" est souvent associé à des outils tels que cut
et awk
. Un champ serait similaire à une colonne de données, si vous prenez les données et les séparez à l'aide d'un caractère spécifique. Généralement, le caractère utilisé pour ce faire est un Espace .
Cependant, comme c'est le cas avec la plupart des outils, il est configurable. Par exemple :
- awk =
awk -F"," ...
- séparerait par des virgules (c'est-à-dire , ). - couper =
cut -d"," ...
- séparerait par des virgules (c'est-à-dire , ).
Exemples
Ce premier montre comment awk
sera automatiquement divisé sur les espaces.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Celui-ci montre comment cut
se divisera également sur les espaces.
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Ici, nous avons une liste CSV de données de colonne que nous utilisons cut
pour renvoyer les colonnes 1 et 4.
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Awk aussi peut le faire :
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Awk est également un peu plus apte à gérer une variété de caractères de séparation. Ici, il s'agit de Tabs avec Espaces où ils sont mélangés en même temps :
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
Qu'en est-il du commutateur -s pour couper ?
En ce qui concerne ce commutateur, il indique simplement cut
pour ne pas imprimer les lignes qui ne contiennent pas le caractère délimiteur spécifié via le -d
commutateur.
Exemple
Supposons que nous ayons ce fichier.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
REMARQUE : Il y a des espaces et des tabulations dans la 2ème chaîne ci-dessus.
Maintenant, lorsque nous traitons ces chaînes en utilisant cut
avec et sans le -s
commutateur :
$ cut -d" " -f1-6 sample.txt
This is a space string.
This is a space
Thisstringcontainsneither.
$ cut -d" " -f1-6 -s sample.txt
This is a space string.
This is a space
Dans le 2ème exemple vous pouvez voir que le -s
switch a omis toutes les chaînes de la sortie qui ne contiennent pas le délimiteur, Espace .
Un champ selon POSIX est toute partie d'une ligne délimitée par l'un des caractères de IFS
, le "séparateur de champ de saisie (ou séparateur de champ interne )." La valeur par défaut de ceci est un espace, suivi d'une tabulation horizontale, suivi d'une nouvelle ligne. Avec Bash, vous pouvez exécuter printf '%q\n' "$IFS"
pour voir sa valeur.
Cela dépend de l'utilitaire en question, mais pour cut
, un "champ" commence au début d'une ligne de texte et inclut tout jusqu'au premier onglet. Le deuxième champ va du caractère après la première tabulation jusqu'à la tabulation suivante. Et ainsi de suite pour le troisième, le quatrième, ... Tout entre les onglets, ou entre le début de ligne et l'onglet, ou entre l'onglet et la fin de ligne.
Sauf si vous spécifiez un délimiteur de champ avec l'option "-d" :cut -d: -f2
vous obtiendriez tout entre les premiers et deuxièmes caractères deux-points (':').
D'autres utilitaires ont des définitions différentes, mais un caractère de tabulation est courant. awk
est une bonne solution de repli si cut
est trop strict, comme awk
divise les champs en fonction d'un ou plusieurs caractères d'espacement. C'est un peu plus naturel dans beaucoup de situations, mais vous devez connaître un peu la syntaxe. Pour imprimer le deuxième champ selon awk
:
awk '{print $2}'
sort
est celui qui me trompe. Mon sort
actuel La page de manuel indique quelque chose comme "transition non vide à vide" pour un séparateur de champs. Pour une raison quelconque, il faut quelques essais pour obtenir sort
champs définis correctement. join
utilise apparemment des champs "délimités par des espaces", ce que awk
prétend faire par défaut.
La morale de l'histoire est d'être prudent et d'expérimenter si vous ne savez pas.