Réponses:
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 -F"," ...
- se séparerait par des virgules (ie ,).cut -d"," ...
- se séparerait par des virgules (ie ,).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.
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.
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.
Un champ selon POSIX est une partie d'une ligne délimitée par l'un des caractères IFS
du " séparateur de champ d'entrée (ou séparateur de champ interne ) " . La valeur par défaut de ceci est l'espace, suivi d'un tabulateur horizontal, suivi d'une nouvelle ligne . Avec Bash, vous pouvez exécuter printf '%q\n' "$IFS"
pour voir sa valeur.
cut
lequel la question a été posée.
cut -d "$IFS"
l'erreur, alors qu'il awk -F"[ \t\n]"
fonctionne comme prévu
Cela 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 elle cut
est trop stricte, car elle awk
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 selon awk
:
awk '{print $2}'
sort
est celui qui me trompe. Ma sort
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 des sort
champs correctement définis. join
utilise apparemment des champs "délimités par des espaces", ce qui est awk
censé faire par défaut.
La morale de l'histoire est d'être prudent et d'expérimenter si vous ne le savez pas.
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 que sort
.
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:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Lorsque vous utilisez la cut
commande, cela prend deux arguments principaux
-d: qui représente le délimiteur
-f: qui signifie que le champ doit être coupé du fichier d'entrée
Ex. cut - d "|" - f1, 2 input_filename
Ici, le output
serait séparé par le délimiteur "|" et il ne coupera que 2 champs du fichier d'entrée
Si vous avez des lignes suivantes dans votre fichier
Alex|120000|Admin|1999
Ensuite, il coupera 2 champs qui sont
Alex|120000
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}'
ou ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
sont très simples, mais ce serait difficile à faire cut
.
Je suis d'accord avec les affiches précédentes que les champs / clés sort
sont difficiles à comprendre! Les champs dans join
semblent fonctionner de la même manière que dans cut
, bien que les join
options soient faciles à se tromper.
echo '$IFS' | cat -vet
pour voir à quoi ressemble la valeur par défaut dans leshell
.