2013-06-13 9 views
5

Ho una breve domanda riguardante il comando AWK. Ho bisogno del comando per stampare fino alla fine della linea sulla stessa linea, ma poi quando arriva alla riga successiva ho bisogno che stampi su un'altra linea. Il seguente esempio fornirà una migliore chiarezza.Comando AWK per stampare fino alla fine della riga

Dice che ho un file:

0 1 2 3 This is line one 
0 1 2 3 This is line two 
0 1 2 3 This is line three 
0 1 2 3 This is line four 

Ho provato quanto segue e ottenuto i seguenti risultati

awk '{for(i=5;i<=NF;i++) print $i}' fileName >> resultsExample1 

ottengo il seguente in resultsExample1

This 
is 
line 
one 
This 
is 
line 
two 
And so on.... 

Esempio 2:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample2 

per resultsExample2 ottengo:

This is line one This is line two this is line three This is line four 

Ho anche provato:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample3 

Ma i risultati erano gli stessi del precedente

Alla fine voglio la seguente:

This is line one 
This is line two 
This is line three 
This is line four 

Sono grato per qualsiasi aiuto! Grazie in anticipo :)

+2

Nell'esempio, tutte le linee hanno lo stesso numero di colonne - è questo sempre il caso con il tuo contributo? –

risposta

6

Può essere più straight-forward per usare cut:

$ cut -d' ' -f5- file 
This is line one 
This is line two 
This is line three 
This is line four 

Questo dice: sui campi separati da spazi, di stampa dal 5 fino alla fine della linea.

Se si dispone di più spazi tra i campi, è possibile inizialmente spremerli con tr -s' '.

+6

Funziona solo se c'è solo uno spazio tra i campi. – Scrutinizer

+3

Questo è vero, @Scrutinizer, ma nel caso ce ne fossero più di uno potremmo in primo luogo eseguire il pipe '| tr -s '' 'per eliminare più spazi. – fedorqui

+0

Come gestirlo se il numero di spazi (il delimitatore) varia da un record all'altro? Ad esempio applicando questo all'output di 'ls -l'? – gone

7

O con awk

awk '{$1=$2=$3=$4=""; sub(/^ */,"", $0); print }' awkTest2.txt 
This is line one 
This is line two 
This is line three 
This is line four 

Inoltre, sei soluzione è quasi arrivati, hai solo bisogno di forzare un '\ n' per essere stampato alla fine di ogni riga processato, ovvero

awk '{for(i=5;i<=NF;i++) {printf $i " "} ; printf "\n"}' awkTest2.txt 
This is line one 
This is line two 
This is line three 
This is line four 

Si noti che il vostro BEGIN { " " } è un no op. E si dovrebbe usare $i invece di $1 per stampare il valore corrente delle iterazioni.

IHTH.

Modifica; Notando sudo_O obiezione, ho aggiunto un% s ai dati. Ecco l'output

This is line one 
This is line two 
This is line three 
T%shis is line four 

Questo può essere un problema per voi, in modo che questo caso leggere su come passare una stringa di formato a printf.

+2

Non si deve usare 'printf' senza specificare il formato. Cosa pensi che succederà se uno dei campi contiene '% s' per esempio? –

+0

Sono d'accordo con sudo_O. Dovresti ottenere 'awk: non abbastanza argomenti in printf (T% shis)' per esempio .. – Scrutinizer

+1

Sto recuperando il mio risultato. Buona fortuna a tutti. – shellter

5

So che questa domanda è molto vecchio, ma un altro esempio awk:

awk '{print substr($0,index($0,$5))}' fileName 

Cosa fa: trovare l'indice in cui si desidera iniziare la stampa (indice di $ 5 di $ 0) e stampare la sottostringa di $ 0 a partire da quell'indice.

+1

Potrebbe essere tardi per la festa, ma ha funzionato benissimo per me. +1 =) – Terrance

0

awk '{gsub (/[[:digit:]]/,"");{$1=$1}}1' file