Qu'est-ce qui constitue un «champ» pour la commande de coupe?

16

Par exemple, la cutcommande peut prendre un paramètre -f, qui selonman

sélectionnez uniquement ces champs; imprime également toute ligne qui ne contient aucun caractère de délimitation, sauf si l'option -s est spécifiée

Dans ce contexte, qu'est-ce qu'un champ?

luca590
la source

Réponses:

19

Le terme "champ" est souvent associé à des outils tels que cutet 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 awkse divisera automatiquement les espaces.

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

Celui-ci montre également comment cutse 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 cutpour 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 cutindique simplement de ne pas imprimer de lignes qui ne contiennent pas le caractère délimiteur spécifié via le -dcommutateur.

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 cutavec et sans le -scommutateur:

$ 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 -scommutateur a omis toutes les chaînes de la sortie qui ne contiennent pas le délimiteur, Space.

slm
la source
8

Un champ selon POSIX est une partie d'une ligne délimitée par l'un des caractères IFSdu " 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.

l0b0
la source
Faites un echo '$IFS' | cat -vet pour voir à quoi ressemble la valeur par défaut dans le shell.
C0deDaedalus
1
IFS est utilisé par le shell dans la plupart des cas (pas tous), mais pas par d'autres programmes et en particulier par cutlequel la question a été posée.
dave_thompson_085
Contrairement à awk, cut ne prend également en charge qu'un seul délimiteur à la fois, de même cut -d "$IFS"l'erreur, alors qu'il awk -F"[ \t\n]"fonctionne comme prévu
JGurtz
2

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: -f2vous 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. awkest une bonne solution de rechange si elle cutest trop stricte, car elle awkdivise 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}'

sortest celui qui me trompe. Ma sortpage 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 sortchamps correctement définis. joinutilise apparemment des champs "délimités par des espaces", ce qui est awkcensé faire par défaut.

La morale de l'histoire est d'être prudent et d'expérimenter si vous ne le savez pas.

Bruce Ediger
la source
2

Le terme "champ" n'est pas lié à linux en général, mais à des programmes spécifiques. cutUtilise 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 -det -fobtenir des champs (ou colonnes) 2, 3 et 6 comme ceci:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Volker Siegel
la source
1

Lorsque vous utilisez la cutcommande, 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 outputserait 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
Shah Honey
la source
Votre exemple est complètement cassé en raison d'espaces incorrects, et même s'il est correct, cela n'ajoute rien aux réponses données il y a 4 ans.
dave_thompson_085
0

cutest 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).

awkles lignes simples sont beaucoup plus flexibles, par exemple lorsque le séparateur de champ d'entrée peut être un espace blanc ( awkpar 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 sortsont difficiles à comprendre! Les champs dans joinsemblent fonctionner de la même manière que dans cut, bien que les joinoptions soient faciles à se tromper.

Laurence Renshaw
la source