Risposte:
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. In genere il personaggio usato per fare questo è a Space.
Tuttavia, come nel caso della maggior parte degli strumenti, è configurabile. Per esempio:
awk -F"," ...
- si separerebbe da virgole (es ,.).cut -d"," ...
- si separerebbe da virgole (es ,.).Questo primo mostra come awk
dividere automaticamente gli spazi.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Questo mostra come cut
verrà suddiviso anche negli 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ò fare questo:
$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4
Awk è anche un po 'più abile nel gestire una varietà di personaggi di separazione. Qui ha a che fare Tabsinsieme a Spacesdove si mescolano contemporaneamente:
$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.
Rispetto a questa opzione, sta semplicemente dicendo cut
di non stampare alcuna riga che non contenga il carattere delimitatore specificato tramite l' -d
opzione.
Supponiamo di avere questo file.
$ cat sample.txt
This is a space string.
This is a space and tab string.
Thisstringcontainsneither.
NOTA: nella seconda stringa sopra sono presenti spazi e tabulazioni.
Ora, quando elaboriamo queste stringhe usando cut
con e senza l' -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 2 ° esempio si può vedere che l' -s
interruttore ha omesso qualsiasi stringa dalla uscita che non contengono il delimitatore, Space.
Un campo secondo POSIX è qualsiasi parte di una riga delimitata da uno dei caratteri in IFS
, il " separatore di campo di input (o separatore di campo interno ). " Il valore predefinito di questo è lo spazio, seguito da un tabulatore orizzontale, seguito da una nuova riga . Con Bash puoi correre printf '%q\n' "$IFS"
per vederne il valore.
cut
quale sia stata la domanda.
cut -d "$IFS"
errore, mentre awk -F"[ \t\n]"
funziona come previsto
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 viene eseguito dal carattere dopo la prima scheda, fino alla scheda successiva. E così via per il terzo, il quarto, ... Tutto tra le schede, o tra l'inizio della riga e la scheda, o tra la scheda e la fine della riga.
A meno che non si specifichi un delimitatore di campo con l'opzione "-d": cut -d: -f2
si otterrebbe tutto tra il primo e il secondo carattere di due punti (':').
Altre utilità hanno definizioni diverse, ma un carattere di tabulazione è comune. awk
è un buon fallback se cut
è troppo severo, in quanto awk
divide i campi in base a uno o più caratteri bianchi. È un po 'più naturale in molte situazioni, ma devi conoscere un po' di sintassi. Per stampare il secondo campo in base a awk
:
awk '{print $2}'
sort
è quello che mi inganna. La mia sort
pagina man attuale dice qualcosa come "transizione da non vuoto a vuoto" per un separatore di campo. Per qualche motivo sono necessari alcuni tentativi per ottenere i sort
campi definiti correttamente. join
apparentemente usa i campi "delimitati da spazi bianchi", che è ciò che awk
pretende di fare di default.
La morale della storia è stare attenti e sperimentare se non lo sai.
Il termine "campo" non è correlato a Linux in generale, ma a programmi specifici. Quindi cut
utilizza un diverso tipo di campo rispetto a sort
.
Con cut
, definisci tu stesso un campo, specificando un delimitatore di campo con l'opzione -d, che separa i campi in ciascuna riga.
Se i tuoi dati sono separati da due punti nelle linee, puoi combinare -d
e -f
ottenere campi (o colonne) 2, 3 e 6 in questo modo:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Quando si utilizza il cut
comando, sono necessari due argomenti principali
-d: che sta per delimitatore
-f: che sta per campo da tagliare dal file di input
Ex. cut - d "|" - f1, 2 input_filename
Qui il output
sarebbe separato dal delimitatore "|" e taglierà solo 2 campi dal file di input
Se hai le seguenti righe nel tuo file
Alex|120000|Admin|1999
Quindi taglierà 2 campi che sono
Alex|120000
cut
è ottimo per casi semplici, in cui il delimitatore è un singolo carattere e si desidera generare un sottoinsieme dei campi di input, nello stesso ordine (anche se lo specifico -f3,2,1
, si comporta come -f1,2,3
).
awk
le linee singole sono molto più flessibili, ad esempio quando il separatore del campo di input potrebbe essere uno spazio bianco ( awk
impostazione predefinita) o quando si desidera produrre campi in un ordine diverso o con un formato particolare.
Ad esempio wc -l myfile | awk '{print $1}'
o ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'
sono molto semplici, ma sarebbe difficile avere a che fare con cut
.
Concordo con i poster precedenti che i campi / le chiavi sort
sono difficili da capire! I campi in join
sembrano funzionare come in cut
, sebbene le join
opzioni siano facili da sbagliare.
echo '$IFS' | cat -vet
per vedere come appare il valore predefinito inshell
.