Ho un file di dati che ho bisogno di trasformare con espressioni regolari. Più in particolare, ho bisogno di mantenere le prime 6 colonne lo stesso, e dalla settima colonna in poi, selezionare solo le colonne dispari e quindi mettere insieme i campi di ogni coppia di righe consecutive. So che sembra un po 'complicato, quindi chiarirò questo attraverso un esempio. Questo è il mio file di dati originali (che potrebbe avere qualsiasi numero di colonne):Selezionare le colonne dispari, quindi mettere insieme i campi delle righe consecutive
A B C D E F 11 12 13 14 15 16 17 18
A B C D E F 21 22 23 24 25 26 27 28
A B C D E F 31 31 33 34 35 36 37 38
A B C D E F 41 42 43 44 45 46 47 48
A B C D E F 51 52 53 54 55 56 57 58
A B C D E F 61 62 63 64 65 66 67 68
A B C D E F 71 72 73 74 75 76 77 78
A B C D E F 81 82 83 84 85 86 87 88
ho capito che posso mantenere i primi 6 colonne e quindi eliminare quelle dispari con
awk '{for (i = 1; i <= NF; i++) if (i < 7 || i % 2 == 1) printf $i OFS}; {print ""}
essendo questo il risultato:
A B C D E F 11 13 15 17
A B C D E F 21 23 25 27
A B C D E F 31 33 35 37
A B C D E F 41 43 45 47
A B C D E F 51 53 55 57
A B C D E F 61 63 65 67
A B C D E F 71 73 75 77
A B C D E F 81 83 85 87
Ma dopo che devo unire i campi di ogni coppia di righe consecutive, in questo modo:
Stavo pensando di usare sed o awk per rendere l'intero processo, dal momento che i miei file di dati sono enormi e ho bisogno di trasformarli in modo efficiente, ma non riuscivo a trovare un modo per fare anche la seconda trasformazione. Qualsiasi aiuto sarebbe molto apprezzato.
Apprezzo molto la tua risposta, è esattamente quello che stavo cercando. Proverò sia la tua soluzione che quella che ho appena scoperto, per testare quale sia più veloce (anche se a prima vista credo che la tua sia migliore). – Serchu
@Serchu: Ho finito di modificare la mia risposta. L'ho reso un po 'più generale (e anche leggermente più criptico). Ora gestirà i file che hanno un numero pari di colonne o un numero dispari di colonne. Puoi persino impostare il numero di colonne iniziali da conservare. HTH. – Steve
Capisco la tentazione di usare getline qui, ma è quasi sempre meglio evitarlo poiché rende difficili i cambiamenti dei requisiti semplici (tra molti altri avvertimenti - vedi http://awk.info/?tip/getline). Cosa succede se, ad esempio, si desidera mantenere anche il conteggio di tutte le linee che contengono 45? Con una soluzione non-getline devi solo aggiungere "/ 45/{C++}" al corpo di awk ma con una soluzione getline devi farlo E aggiungi "if (line ~/45 /) {C++}" dopo il getline, complicando le cose e creando codice duplicato solo per un piccolo cambiamento di requisiti concettualmente banale. –