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.