Hoe de eerste n tekens van elke regel in het Unix-gegevensbestand te krijgen

Ik probeer de eerste 22 tekens uit een Unix-gegevensbestand te halen. Hier zijn mijn gegevens zoals hieronder.

De eerste 12 tekens zijn kolom 1 en de volgende 10 tekens zijn de 2e kolom.

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-

Antwoord 1, autoriteit 100%

Met cut:

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

Als ik de tweede vereiste begrijp, wil je de eerste 22 tekens opsplitsen in twee kolommen van 10 en 12. sedis hiervoor de beste keuze:

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

Antwoord 2, autoriteit 3%

sudo_O heeft gezorgd voor een mooie snit en sed-oplossing, ik heb zojuist een awk one-liner toegevoegd:

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

met lege tekens (het hangt af van uw vereisten, u wilt de spaties overslaan of u wilt ze opnemen en tellen in uw uitvoer)

als lege spaties moeten worden geteld en ook in de uitvoer moeten worden weergegeven: (u hoeft de cmd hierboven niet te wijzigen)

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

als je die spaties wilt overslaan:
(snel en vies)

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

Antwoord 3, autoriteit 2%

Dit kan in Bash worden gedaan zonder externe programma’s te gebruiken (scripts die dit gebruiken moeten beginnen met #!/bin/bashin plaats van #!/bin/shen zal niet POSIX-shell-compatibel zijn) met behulp van de uitdrukking ${VARIABLE:offset:length}(waarbij :lengthoptioneel is):

#!/bin/bash
STR="123456789"
echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}

heeft deze uitvoer:

1
12345
123456789
6789
9

Houd er rekening mee dat de startoffset begint bij nul en dat de lengte minimaal één moet zijn. U kunt ook een offset vanaf de rechterkant van de tekenreeks gebruiken met een negatieve offset tussen haakjes:

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

Als u een bestand wilt lezen, haalt u de eerste 8 tekens voor elke regel herhaaldelijk op en drukt u ze af naar de terminal. Gebruik hiervoor een while-lus als volgt:

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

Een uiterst nuttige bron voor alles wat u moet weten over Bash-stringmanipulatie is hier: https://tldp.org/LDP/abs/html/string-manipulation.html

Other episodes