Ini sebenarnya dapat dilakukan di Bash tanpa menggunakan program eksternal apa pun (skrip yang menggunakan ini harus dimulai dengan #!/bin/bash
bukannya #!/bin/sh
dan tidak akan sesuai dengan POSIX shell) menggunakan ekspresi ${VARIABLE:offset:length}
(di mana :length
opsional):
#!/bin/bash
STR="123456789"
echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}
akan memiliki output ini:
1
12345
123456789
6789
9
Perhatikan bahwa offset awal dimulai dari nol dan panjangnya minimal harus satu. Anda juga dapat melakukan offset dari sisi kanan string menggunakan offset negatif dalam tanda kurung:
echo ${STR:(-5):4}
5678
Untuk membaca file, ambil 8 karakter pertama berulang kali untuk setiap baris, dan cetak ke terminal, gunakan while
lingkaran seperti ini:
while read LINE
do echo "${STD:0:8}"
done < "/path/to/the/text_file"
Sumber daya yang sangat berguna untuk semua yang perlu Anda ketahui tentang manipulasi string Bash ada di sini:https://tldp.org/LDP/abs/html/string-manipulation.html
Dengan cut
:
$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001
Jika saya memahami persyaratan kedua, Anda ingin membagi 22 karakter pertama menjadi dua kolom dengan panjang 10 dan 12. sed
adalah pilihan terbaik untuk ini:
$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001
sudo_O telah memberikan solusi cut and sed yang bagus, saya baru saja menambahkan awk one-liner:
awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file
echo "000000000001199998000180000 DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001
dengan karakter kosong (tergantung pada kebutuhan Anda, Anda ingin melewatkan spasi atau Anda ingin memasukkan dan menghitungnya dalam keluaran Anda)
jika ruang kosong harus dihitung dan ditampilkan di output juga:(Anda tidak perlu mengubah cmd di atas)
echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0 0 0 0 00000001199998
jika Anda ingin melewati ruang tersebut:(cepat dan kotor)
echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001