web-dev-qa-db-fra.com

Comment obtenir les n premiers caractères dans un fichier de données Unix

J'essaie d'obtenir les 22 premiers caractères d'un fichier de données Unix. Voici mes données comme ci-dessous.

Les 12 premiers caractères correspondent à la colonne 1 et les 10 suivants à la 2e colonne.

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-
39
Teja

Avec cut:

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

Si je comprends 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
72
Chris Seymour

Sudo_O a fourni une solution Nice cut and sed, je viens d'ajouter un awk one-liner:

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 voulez sauter les espaces ou vous voulez les inclure et les compter dans votre sortie)

si les espaces vides doivent également être comptés et affichés 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 sauter ces espaces: (rapide et sale)

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