2013-01-22 15 views
26

Sto cercando di ottenere i primi 22 caratteri da un file di dati Unix. Ecco i miei dati come di seguito.Come ottenere i primi n caratteri nel file di dati unix

I primi 12 caratteri sono nella colonna 1 e i successivi 10 caratteri nella seconda colonna.

000000000001199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000002199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000003199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000004199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000005199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000006199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
+3

vuoi il primo 2 2 caratteri del file o i primi 22 caratteri di ogni riga? Dovresti modificare la domanda se vuoi dati da ciascuna linea. Come richiesto, 'dd' è lo strumento che si desidera ottenere i primi 22 caratteri dal file. –

risposta

56

Con cut:

$ cut -c-22 file 
0000000000011999980001 
0000000000021999980001 
0000000000031999980001 
0000000000041999980001 
0000000000051999980001 
0000000000061999980001 

Se ho ben capito il secondo requisito si desidera dividere i primi 22 caratteri in due colonne di lunghezza 10 e 12. sed è la scelta migliore per questo:

$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file 
0000000000 011999980001 
0000000000 021999980001 
0000000000 031999980001 
0000000000 041999980001 
0000000000 051999980001 
0000000000 061999980001 
+0

Cosa fa il -r? Ho provato questo comando sed, ma ricevo un errore che mi informa che -r è un'opzione illegale – interstellar

+0

@interstellar con GNU sed si passa alle espressioni regolari estese, l'opzione equivalente per BSD sed è -E. –

3

sudo_O ha fornito bel taglio e la soluzione sed, ho solo aggiunto un awk one-liner:

awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file 

echo "000000000001199998000180000  DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' 
0000000000011999980001 

con char vuota (dipende dal vostro requisito, si desidera saltare gli spazi o se si vuole includere e le considero in uscita)

se gli spazi vuoti devono essere contati e visualizzati in uscita pure: (non c'è bisogno di cambiare il cmd sopra)

echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                   
0 0 0 0 00000001199998 

se si desidera saltare quegli spazi: (rapido e sporco)

echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                
0000000000011999980001 
Problemi correlati