GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir les n premiers caractères de chaque ligne dans le fichier de données Unix

Cela peut en fait être fait dans Bash sans utiliser de programmes externes (les scripts utilisant cela doivent commencer par #!/bin/bash au lieu de #!/bin/sh et ne sera pas compatible avec le shell POSIX) en utilisant l'expression ${VARIABLE:offset:length} (où :length est facultatif) :

#!/bin/bash

STR="123456789"

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

aura cette sortie :

1
12345
123456789
6789
9

Notez que le décalage de départ commence à zéro et que la longueur doit être au moins égale à un. Vous pouvez également décaler à partir du côté droit de la chaîne en utilisant un décalage négatif entre parenthèses :

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

5678

Pour lire un fichier, récupérez les 8 premiers caractères à plusieurs reprises pour chaque ligne et imprimez-les sur le terminal, utilisez un while boucle comme ceci :

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

Une ressource extrêmement utile pour tout ce que vous devez savoir sur la manipulation de chaînes Bash est ici :https://tldp.org/LDP/abs/html/string-manipulation.html


Avec cut :

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

Si je comprends bien la deuxième exigence, vous souhaitez diviser les 22 premiers caractères en deux colonnes de longueur 10 et 12. sed est le meilleur choix pour cela :

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

sudo_O a fourni une belle solution de coupe et de sed, je viens d'ajouter une ligne awk :

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

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

avec un caractère vide (cela dépend de vos besoins, vous souhaitez ignorer les espaces ou vous souhaitez les inclure et les compter dans votre sortie)

si les espaces vides doivent être comptés et affichés également dans la sortie :(vous n'avez pas à modifier la cmd ci-dessus)

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

si vous voulez ignorer ces espaces :(rapide et sale)

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

Linux
  1. Comment insérer du texte avant la première ligne d'un fichier ?

  2. Comment nettoyer les extensions de fichiers ?

  3. Comment insérer un espace tous les quatre caractères dans une longue ligne ?

  4. Comment compter les lignes d'un fichier sous UNIX/Linux

  5. Comment ajouter une chaîne de date à chaque ligne d'un fichier journal écrit en continu

Comment lire un fichier ligne par ligne dans Bash

Comment convertir un fichier Windows en un fichier UNIX

Comment faire chaque sélection de menu sur 1 ligne au lieu de plusieurs sélections sur 1 ligne ?

Comment analyser chaque ligne d'un fichier texte comme argument d'une commande ?

Comment faire écho dans le fichier

Comment obtenir l'URL du fichier Dropbox à partir de la ligne de commande ?