2010-07-07 10 views

risposta

32
awk '!(NR%2){print$0p}{p=$0}' infile 
+1

Qualcuno dovrebbe preoccuparsi di spiegare come funziona questa espressione awk? Principalmente la parte! (NR% 2). – mjuarez

+2

NR rappresenta il numero di righe ... % è l'operatore modulu (cioè un% b è il resto quando a è diviso per b) ... (NR% 2) è il modulu di NR di due, cioè è true quando NR è pari o falso quando dispari ... ! (NR% 2) è vero quando NR è dispari, quindi ... ! (NR% 2) {print $ 0p} significa che il programma stamperà la linea concatenata con la variabile p, solo su linee dispari ... {p = $ 0} significa che su ogni riga, p è impostato come linea corrente (ma solo dopo aver stampato la riga corrente e quella precedente se la linea corrente è dispari). – shiri

+0

Con un numero dispari di linee di input, questo metodo non stamperà la linea finale. –

4
awk 'BEGIN{i=1}{line[i++]=$0}END{j=1; while (j<i) {print line[j+1] line[j]; j+=2}}' yourfile 

Non c'è bisogno di sed.

+0

Buono risposta .... ma suppongo di aver chiesto la linea completa non solo il primo campo. Quindi ora deve essere cambiato come 'line [i ++] = $ 0' invece di' line [i ++] = $ 1'. Ma un ottimo risposta di ks :) – Vijay

1

Qui è in sed:

sed 'h;s/.*//;N;G;s/\n//g' < filename 
+2

Il reindirizzamento non è necessario. –

+0

@Dennis Williamson: hai ragione, è la forza dell'abitudine. – Beta

0

Alcuni miglioramenti allo script "sed" di cui sopra che si terrà il seguente: -2734406,132904 -2734414,838455 -2734413.594009 -2734417.316269 -2734414,779617

and make it :  

1008 -2734406,132904
2846 -2734414,838455
4636 -2734413,594009
6456 -2734417,316269
8276 -2734414,779617

the "sed" is : "sed 'h;s/.*//;G;N;s/\n/ /g'" 
3

Dicono che l'imitazione è la forma più sincera di adulazione.
Ecco una soluzione Perl ispirato dal codice awk di Dimitre:

perl -lne 'print "$_$p" if $. % 2 == 0; $p = $_' infile 

$_ è la linea corrente
$. è il numero di riga

0

È possibile utilizzare printf con un ternario:

awk '{printf (NR%2==0) ? $0 "\n" : $0}' 
Problemi correlati