Concludendo...
L'esigenza di questo comando è nata perché sto facendo dei bellissimi grafici tridimensionali di alcuni dataset.
Questi file di dati arrivano ad essere composti da un numero inverosimilmente elevato di punti... roba di milioni di righe.
Quando lo passo a LaTeX (o, meglio, quando lo faccio elaborare dal pacchetto Pgfplots) vedo il warning "A soreta!"
Ho pertanto pensato di cogliere due piccione con una fava. Riduco il numero di dati ma non lo faccio in modo "uniforme".
Per questa estrazione, mi serve l'estrazione di un numero N di questi blocchi, ogni M.
Dal momento che questa estrazione è meglio che non sia uniforme (nel senso che in alcuni punti del file originale intensifico e in altri dirado il numero di record estratti), mi serve poter impostare uno start e uno stop.
Supponendo di avere un file di *righe normali* e di voler fare l'estrazione di 2 righe ogni 5, fino alla 15 (esclusa)... ovvero di voler estrarre le righe 1,2,6,7,11,12 si può fare una cosa del genere:
Codice: Seleziona tutto
vaevictis@vaevictis-HAL:~/Programmazione/Bash/Awk/EstrazioneParagrafi$ awk -v start=1 -v lines=2 -v every=5 -v stop=15 '{if (counter > 0) {print; --counter}} NR>=stop {exit} NR == start {print; counter=lines-1; start+=every}' FileRigheNormali.txt
riga-1
riga-2
riga-6
riga-7
riga-11
riga-12
Stavo morendo su come far rimanere awk di stucco, con un mega barbatrucco... poi siete arrivati voi e mi avete mostrato la via di RS.
Usando questa fantastica variabile, si può tranquillamente "estendere" il precedente comando con il BEGIN che mi avete suggerito:
Codice: Seleziona tutto
vaevictis@vaevictis-HAL:~/Programmazione/Bash/Awk/EstrazioneParagrafi$ awk -v start=1 -v lines=2 -v every=5 -v stop=15 'BEGIN {RS="\n[ \t\n]*\n";ORS="\n\n"} {if (counter > 0) {print; --counter}} NR>=stop {exit} NR == start {print; counter=lines-1; start+=every}' FileParagrafi.txt
1 foo-1-1 bar-1-1
1 foo-1-2 bar-1-2
2 foo-2-1 bar-2-1
2 foo-2-2 bar-2-2
2 foo-2-3 bar-2-3
2 foo-2-4 bar-2-4
6 foo-6-1 bar-6-1
6 foo-6-2 bar-6-2
6 foo-6-3 bar-6-3
6 foo-6-4 bar-6-4
7 foo-7-1 bar-7-1
7 foo-7-2 bar-7-2
7 foo-7-3 bar-7-3
7 foo-7-4 bar-7-4
7 foo-7-5 bar-7-5
7 foo-7-6 bar-7-6
11 foo-11-1 bar-11-1
11 foo-11-2 bar-11-2
11 foo-11-3 bar-11-3
12 foo-12-1 bar-12-1
Cambiando RS, awk vede un blocco come singolo record... e NR non indica più le righe normali... ma il blocco intero.
Standing ovation per il programmatore che ha pensato ad RS.
Standing ovation per voi che me l'avete presentata!!
Alla prossima e grazie di cuore!
p.s.:
c'è la magagna legata al fatto che se non si passa lo "stop" awk si ferma subito, ma si risolve facile:
Codice: Seleziona tutto
vaevictis@vaevictis-HAL:~/Programmazione/Bash/Awk/EstrazioneParagrafi$ awk -v start=1 -v lines=2 -v every=5 '{if (counter > 0) {print; --counter}} stop && NR>=stop {exit} NR == start {print; counter=lines-1; start+=every}' FileRigheNormali.txt
riga-1
riga-2
riga-6
riga-7
riga-11
riga-12
riga-16
riga-17
riga-21
riga-22
riga-26
riga-27
riga-31
riga-32
riga-36
riga-37
riga-41
riga-42
riga-46
riga-47