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 en utilisant un caractère spécifique. Généralement, le caractère utilisé pour ce faire est a Space.
Cependant, comme c'est le cas avec la plupart des outils, il est configurable. Par exemple:
- awk =
awk -F"," ...
- se séparerait par des virgules (ie ,).
- cut =
cut -d"," ...
- se séparerait par des virgules (ie ,).
Exemples
Cette première montre comment awk
se divisera automatiquement les espaces.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Celui-ci montre également comment cut
se répartira 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 peut aussi 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 personnages de séparation. Ici , il a affaire Tabsavec Spacesoù ils sont mélangés entre 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 cut
indique simplement de ne pas imprimer de lignes qui ne contiennent pas le caractère délimiteur spécifié via le -d
commutateur.
Exemple
Disons que nous avions 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
commutateur a omis toutes les chaînes de la sortie qui ne contiennent pas le délimiteur, Space.
echo '$IFS' | cat -vet
pour voir à quoi ressemble la valeur par défaut dans leshell
.cut
lequel la question a été posée.cut -d "$IFS"
l'erreur, alors qu'ilawk -F"[ \t\n]"
fonctionne comme prévuCela dépend de l'utilitaire en question, mais pour
cut
, un "champ" commence au début d'une ligne de texte, et comprend tout jusqu'au premier onglet. Le deuxième champ va du caractère après le premier onglet à l'onglet suivant. Et ainsi de suite pour les troisième, quatrième, ... Tout entre les onglets, ou entre le début de la ligne et l'onglet, ou entre l'onglet et la fin de la ligne.Sauf si vous spécifiez un délimiteur de champ avec l'option "-d":
cut -d: -f2
vous obtiendrez tout entre le premier et le deuxième caractère 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 rechange si ellecut
est trop stricte, car elleawk
divise les champs en fonction d'un ou de plusieurs espaces. C'est un peu plus naturel dans beaucoup de situations, mais vous devez connaître un peu de syntaxe. Pour imprimer le deuxième champ selonawk
:sort
est celui qui me trompe. Masort
page de manuel actuelle dit quelque chose comme "transition non vide à vide" pour un séparateur de champs. Pour une raison quelconque, il faut quelques essais pour obtenir dessort
champs correctement définis.join
utilise apparemment des champs "délimités par des espaces", ce qui estawk
censé faire par défaut.La morale de l'histoire est d'être prudent et d'expérimenter si vous ne le savez pas.
la source
Le terme "champ" n'est pas lié à linux en général, mais à des programmes spécifiques.
cut
Utilise donc un autre type de champ quesort
.Avec
cut
, vous définissez vous-même ce qu'est un champ, en spécifiant un délimiteur de champ avec l'option -d, qui sépare les champs de chaque ligne.Si vos données sont séparées par des deux-points dans les lignes, vous pouvez combiner
-d
et-f
obtenir des champs (ou colonnes) 2, 3 et 6 comme ceci:la source
Lorsque vous utilisez la
cut
commande, cela prend deux arguments principauxIci, le
output
serait séparé par le délimiteur "|" et il ne coupera que 2 champs du fichier d'entréeSi vous avez des lignes suivantes dans votre fichier
Ensuite, il coupera 2 champs qui sont
la source
cut
est idéal pour les cas simples, où le délimiteur est un seul caractère et que vous souhaitez sortir un sous-ensemble des champs de saisie, dans le même ordre (même si je le spécifie-f3,2,1
, il agit de la même manière que-f1,2,3
).awk
les lignes simples sont beaucoup plus flexibles, par exemple lorsque le séparateur de champ d'entrée peut être un espace blanc (awk
par défaut), ou lorsque vous souhaitez sortir des champs dans un ordre différent ou avec un format particulier.Par exemple
wc -l myfile | awk '{print $1}'
ouls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
sont très simples, mais ce serait difficile à fairecut
.Je suis d'accord avec les affiches précédentes que les champs / clés
sort
sont difficiles à comprendre! Les champs dansjoin
semblent fonctionner de la même manière que danscut
, bien que lesjoin
options soient faciles à se tromper.la source