GNU/Linux >> Belajar Linux >  >> Linux

Cara mendapatkan n karakter pertama dari setiap baris dalam file data unix

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

Linux
  1. Bagaimana Cara Menyisipkan Teks Sebelum Baris Pertama Sebuah File?

  2. Bagaimana Cara Membersihkan Ekstensi File?

  3. Bagaimana Cara Membuat Setiap Pilihan Menu Dalam 1 Baris Alih-alih Beberapa Pilihan Dalam 1 Baris?

  1. Bagaimana Mengurai Setiap Baris File Teks Sebagai Argumen Untuk Perintah?

  2. Cara Menghitung baris dalam file di UNIX/Linux

  3. Cara menambahkan string tanggal ke setiap baris file log yang terus ditulis

  1. Bagaimana saya bisa menambahkan string ke awal setiap baris dalam sebuah file?

  2. dapatkan 5 karakter pertama dari setiap baris dalam skrip Shell

  3. unix - membagi file .gz besar per baris