tagliare la colonna 2 dal file di testo


15

Il mio file di testo non ha delimitatori per specificare solo spazi di separazione, come posso tagliare la colonna 2 al file di output,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Quindi l'output di cui ho bisogno è

207
412
432

Risposte:


13

È più semplice con awkcui tratta più spazi consecutivi come uno singolo, quindi

awk '{print $2}' file

stampe

207
412
431

Ma ovviamente ci sono molti, molti altri strumenti che faranno il lavoro, anche non progettati per compiti come grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file

6

Usa le pipe per inviare i tuoi dati (ad es. Cat columns.txt) al taglio.

cat columns.txt | cut -d" " -f5

Nei dati di esempio forniti, un singolo delimitatore di spazio inserisce i dati desiderati nel campo 5. Per inviare l'output in un altro file, utilizzare il reindirizzamento.

cat collumns.txt | cut -d" " -f5 > field2.txt

Usando il comando awk potresti fare qualcosa come il seguente che riconosce automaticamente il campo che stai cercando perché ci sono dei dati lì (?) Ho bisogno di saperne di più su awk.

awk -F' ' '{print $2}' columns.txt

3
L'incaturazione cat ... |è raramente necessaria. La maggior parte dei comandi Unix come cutprendere uno o più file di input come argomenti, ad es cut -d" " -f5 columns.txt.
Denis Howe,

1

come ha detto @jimmij, awk '{print $2}' fileè la risposta più semplice.

Se, per qualche motivo, non si desidera utilizzare awke insistere sull'uso cut, è possibile utilizzare sedper convertire ogni istanza di due o più spazi in una singola scheda ( cutdelimitatore predefinito) prima di eseguire il piping in cut:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

Puoi ancora utilizzare singoli spazi come delimitatore, avrai solo più colonne. Aumenta il valore dato cut -d' ' -fda 2 a 5, o forse 6. Aumenta il numero fino a ottenere i risultati desiderati.


0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Sopra uno è molto utile quando le utility Linux come awk per l'estrazione dei dati non funzionano se si passa a un utente "root" all'interno di uno script shell come quello sotto:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF

1
L'unico motivo per cui " awknon funzionerà" nel tuo esempio è che il documento qui non è quotato, il che significa che $2sarebbe espanso dalla shell al secondo parametro posizionale. Probabilmente la soluzione non è passare a un grepcomando ma sfuggire a $in $2as \$2o semplicemente citare l'intero documento usando <<'EOF'al posto di <<EOF. Nota inoltre che l'attività nel tuo esempio viene eseguita più semplicemente da pgrep.
Kusalananda

Grazie mille @Kusalananda. Ha funzionato come un fascino.
Alok Tiwari,
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.