Bagaimana saya bisa membuat array dari baris pertama dari beberapa sumber teks?

8

Saya memiliki array jalur ke file yang masing-masing memiliki beberapa baris teks. Saya ingin menghasilkan array yang diisi dengan baris pertama dari setiap file yang diproses seperti ini:

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

Paling-paling saya hanya mendapatkan satu nilai dalam array saya. Saya tidak bisa mendapatkan array yang saya cari dari loop for. Saya sudah mencoba banyak variasi dan mengalami kesulitan mencari tahu di mana saya salah.

dimmech
sumber

Jawaban:

11

Kamu inginkan

lines+=("$line")

+=WORD adalah penggabungan string (atau penambahan). Sebuah tugas senyawa +=(...) menambahkan nilai-nilai ke array.

Anda mungkin juga ingin mengutip semua ekspansi variabel Anda di sini - yang linepasti membutuhkannya jika baris tersebut mungkin berisi spasi, tetapi Anda bisa memiliki masalah di tempat lain juga.

Michael Homer
sumber
Terima kasih, masuk akal sekarang mengapa dalam beberapa upaya saya sepertinya hasilnya adalah campuran dari dua baris.
dimmech
4

Di Bash Anda juga bisa membaca baris ke dalam array secara langsung. Jika Anda memilih panjang array saat ini ${#lines[@]}sebagai indeks penyisipan, Anda dapat menambahkannya:

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

Kutipan sinopsis

mapfile mapfile [-n count] [-O origin] [-t] [array]

Membaca baris dari standar input ke dalam indeks variabel array array yang [...]. Opsi, jika disediakan, memiliki arti sebagai berikut:

  • -n: Salin paling banyak baris hitungan . Jika jumlah adalah 0, semua baris akan disalin.

  • -O: Mulai menetapkan untuk array di asal indeks . Indeks default adalah 0.

  • -t: Hapus baris baru dari setiap baris yang dibaca.

David Foerster
sumber