Il termine "campo" è spesso associato a strumenti come cut
e awk
. Un campo sarebbe simile a una colonna di dati, se prendi i dati e li separi usando un carattere specifico. Tipicamente il carattere usato per fare questo è uno Spazio .
Tuttavia, come nel caso della maggior parte degli strumenti, è configurabile. Ad esempio:
- awk =
awk -F"," ...
- sarebbe separato da virgole (ad es. , ). - taglio =
cut -d"," ...
- sarebbe separato da virgole (ad es. , ).
Esempi
Questo primo mostra come awk
automaticamente si dividerà sugli spazi.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Questo mostra come cut
si dividerà anche sugli spazi.
$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.
Qui abbiamo un elenco CSV di dati di colonna che stiamo usando cut
per restituire le colonne 1 e 4.
$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4
Anche Awk può farlo:
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Awk è anche un po' più abile nell'affrontare una varietà di caratteri di separazione. Qui si tratta di Tabulazioni insieme a Spazi dove sono mescolati contemporaneamente:
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
E l'opzione -s per tagliare?
Per quanto riguarda questo interruttore, dice semplicemente cut
per non stampare alcuna riga che non contenga il carattere delimitatore specificato tramite -d
interruttore.
Esempio
Diciamo che abbiamo questo file.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
NOTA: Ci sono spazi e tabulazioni nella seconda stringa sopra.
Ora quando elaboriamo queste stringhe usando cut
con e senza -s
interruttore:
$ 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
Nel secondo esempio puoi vedere che -s
switch ha omesso qualsiasi stringa dall'output che non contenga il delimitatore, Spazio .
Un campo secondo POSIX è qualsiasi parte di una riga delimitata da uno qualsiasi dei caratteri in IFS
, il "separatore del campo di input (o separatore di campo interno )." Il valore predefinito di questo è spazio, seguito da un tabulatore orizzontale, seguito da una nuova riga. Con Bash puoi eseguire printf '%q\n' "$IFS"
per vederne il valore.
Dipende dall'utilità in questione, ma per cut
, un "campo" inizia all'inizio di una riga di testo e include tutto fino alla prima scheda. Il secondo campo va dal carattere dopo la prima scheda, fino alla scheda successiva. E così via per la terza, la quarta, ... Tutto tra tabulazioni, o tra inizio riga e tabulazione, o tra tabulazione e fine riga.
A meno che non specifichi un delimitatore di campo con l'opzione "-d":cut -d: -f2
otterrebbe tutto tra il primo e il secondo carattere dei due punti (':').
Altre utilità hanno definizioni diverse, ma un carattere di tabulazione è comune. awk
è un buon fallback se cut
è troppo rigido, come awk
divide i campi in base a uno o più spazi bianchi. È un po' più naturale in molte situazioni, ma devi conoscere un po' di sintassi. Per stampare il secondo campo secondo awk
:
awk '{print $2}'
sort
è quello che mi inganna. Il mio attuale sort
la pagina man dice qualcosa come "transizione da vuoto a vuoto" per un separatore di campo. Per qualche ragione ci vogliono alcuni tentativi per ottenere sort
campi definiti correttamente. join
apparentemente utilizza campi "delimitati da spazi bianchi", che è ciò che awk
pretende di fare per impostazione predefinita.
La morale della storia è stare attenti e sperimentare se non lo sai.