To lze ve skutečnosti provést v Bash bez použití jakýchkoli externích programů (skripty používající toto musí začínat #!/bin/bash
místo #!/bin/sh
a nebude kompatibilní s POSIX shell) pomocí výrazu ${VARIABLE:offset:length}
(kde :length
je volitelné):
#!/bin/bash
STR="123456789"
echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}
bude mít tento výstup:
1
12345
123456789
6789
9
Všimněte si, že počáteční offset začíná na nule a délka musí být alespoň jedna. Můžete také odsadit z pravé strany řetězce pomocí záporného odsazení v závorkách:
echo ${STR:(-5):4}
5678
Chcete-li číst soubor, opakovaně načtěte prvních 8 znaků pro každý řádek a vytiskněte je na terminál, použijte while
smyčka takto:
while read LINE
do echo "${STD:0:8}"
done < "/path/to/the/text_file"
Extrémně užitečný zdroj pro vše, co potřebujete vědět o manipulaci s řetězcem Bash, je zde:https://tldp.org/LDP/abs/html/string-manipulation.html
S cut
:
$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001
Pokud rozumím druhému požadavku, chcete rozdělit prvních 22 znaků do dvou sloupců o délce 10 a 12. sed
je pro to nejlepší volbou:
$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001
sudo_O poskytlo pěkné řešení střihu a sed, jen jsem přidal awk one-liner:
awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file
echo "000000000001199998000180000 DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001
s prázdným znakem (záleží na vašem požadavku, chcete přeskočit mezery nebo je chcete zahrnout a započítat do výstupu)
pokud by se prázdná místa měla počítat a zobrazovat také ve výstupu:(nemusíte měnit cmd výše)
echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0 0 0 0 00000001199998
pokud chcete tyto mezery přeskočit:(rychlé a špinavé)
echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001