Cosa costituisce un 'campo' per il comando cut?


16

Ad esempio, il cutcomando può prendere un parametro -f, che secondoman

seleziona solo questi campi; stampa anche qualsiasi riga che non contiene caratteri delimitatori, a meno che non sia specificata l'opzione -s

In questo contesto, cos'è un campo?

Risposte:


19

Il termine "campo" è spesso associato a strumenti come cute 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 = awk -F"," ...- si separerebbe da virgole (es ,.).
  • cut = cut -d"," ...- si separerebbe da virgole (es ,.).

Esempi

Questo primo mostra come awkdividere automaticamente gli spazi.

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

Questo mostra come cutverrà 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 cutper 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.

Che dire dell'interruttore -s per tagliare?

Rispetto a questa opzione, sta semplicemente dicendo cutdi non stampare alcuna riga che non contenga il carattere delimitatore specificato tramite l' -dopzione.

Esempio

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 cutcon e senza l' -sinterruttore:

$ 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' -sinterruttore ha omesso qualsiasi stringa dalla uscita che non contengono il delimitatore, Space.


8

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.


Fai un echo '$IFS' | cat -vet per vedere come appare il valore predefinito in shell.
C0deDaedalus,

1
IFS viene utilizzato dalla shell per la maggior parte degli scopi (non tutti), ma non da altri programmi e in particolare non da cutquale sia stata la domanda.
dave_thompson_085

A differenza di awk, cut supporta anche solo un delimitatore alla volta, quindi cut -d "$IFS"errore, mentre awk -F"[ \t\n]"funziona come previsto
JGurtz

2

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: -f2si 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 awkdivide 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 sortpagina 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 sortcampi definiti correttamente. joinapparentemente usa i campi "delimitati da spazi bianchi", che è ciò che awkpretende di fare di default.

La morale della storia è stare attenti e sperimentare se non lo sai.


2

Il termine "campo" non è correlato a Linux in generale, ma a programmi specifici. Quindi cututilizza 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 -de -fottenere campi (o colonne) 2, 3 e 6 in questo modo:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6

1

Quando si utilizza il cutcomando, 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 outputsarebbe 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

Il tuo esempio è completamente rotto a causa di spazi errati e anche se corretto ciò non aggiunge nulla alle risposte fornite 4 anni fa.
dave_thompson_085

0

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

awkle linee singole sono molto più flessibili, ad esempio quando il separatore del campo di input potrebbe essere uno spazio bianco ( awkimpostazione 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 sortsono difficili da capire! I campi in joinsembrano funzionare come in cut, sebbene le joinopzioni siano facili da sbagliare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.