GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere i primi n caratteri di ogni riga nel file di dati unix

Questo può effettivamente essere fatto in Bash senza utilizzare alcun programma esterno (gli script che lo utilizzano devono iniziare con #!/bin/bash invece di #!/bin/sh e non sarà compatibile con la shell POSIX) utilizzando l'espressione ${VARIABLE:offset:length} (dove :length è facoltativo):

#!/bin/bash

STR="123456789"

echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}

avrà questo output:

1
12345
123456789
6789
9

Si noti che l'offset iniziale inizia da zero e la lunghezza deve essere almeno uno. Puoi anche eseguire l'offset dal lato destro della stringa utilizzando un offset negativo tra parentesi:

echo ${STR:(-5):4}

5678

Per leggere un file, recupera ripetutamente i primi 8 caratteri per ogni riga e stampali sul terminale, usa un while loop come questo:

while read LINE
    do echo "${STD:0:8}"
done < "/path/to/the/text_file"

Una risorsa estremamente utile per tutto ciò che devi sapere sulla manipolazione delle stringhe di Bash è qui:https://tldp.org/LDP/abs/html/string-manipulation.html


Con cut :

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

Se capisco il secondo requisito, vuoi 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

sudo_O ha fornito una bella soluzione cut and sed, ho appena aggiunto una battuta awk:

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

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

con carattere vuoto (dipende dalle tue esigenze, vuoi saltare gli spazi o vuoi includerli e contarli nel tuo output)

se gli spazi vuoti devono essere contati e visualizzati anche nell'output:(non è necessario modificare il cmd sopra)

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

se vuoi saltare quegli spazi:(veloce e sporco)

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

Linux
  1. Come fare ogni selezione di menu in 1 riga invece di selezioni multiple in 1 riga?

  2. Come analizzare ogni riga di un file di testo come argomento di un comando?

  3. Come contare le righe in un file in UNIX/Linux

  4. In Bash, come aggiungo una stringa dopo ogni riga in un file?

  5. In una shell Linux come posso elaborare ogni riga di una stringa multilinea?

Come leggere un file riga per riga in Bash

Come convertire un file Windows in un file UNIX

Come fare eco in un file

ottenere i primi 5 caratteri da ogni riga nello script di shell

unix - divide un enorme file .gz per riga

Come ottenere l'URL del file Dropbox dalla riga di comando?