GNU/Linux >> Belajar Linux >  >> Linux

Mengulang konten file di Bash

cat peptides.txt | while read line 
do
   # do something with $line here
done

dan varian one-liner:

cat peptides.txt | while read line; do something_with_$line_here; done

Opsi ini akan melewatkan baris terakhir file jika tidak ada umpan baris tambahan.

Anda dapat menghindari ini dengan cara berikut:

cat peptides.txt | while read line || [[ -n $line ]];
do
   # do something with $line here
done

Opsi 1a: While loop:Satu baris sekaligus:Input redirection

#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do 
    echo "$p"
done < "$filename"

Opsi 1b: While loop:Satu baris sekaligus:
Buka file, baca dari deskriptor file (dalam hal ini deskriptor file #4).

#!/bin/bash
filename='peptides.txt'
exec 4<"$filename"
echo Start
while read -u4 p ; do
    echo "$p"
done

Ini tidak lebih baik dari jawaban lain, tetapi merupakan satu lagi cara untuk menyelesaikan pekerjaan dalam file tanpa spasi (lihat komentar). Saya menemukan bahwa saya sering membutuhkan one-liners untuk menggali daftar dalam file teks tanpa langkah ekstra menggunakan file skrip terpisah.

for word in $(cat peptides.txt); do echo $word; done

Format ini memungkinkan saya untuk meletakkan semuanya dalam satu baris perintah. Ubah bagian "echo $word" menjadi apa pun yang Anda inginkan dan Anda dapat mengeluarkan beberapa perintah yang dipisahkan oleh titik koma. Contoh berikut menggunakan konten file sebagai argumen ke dalam dua skrip lain yang mungkin telah Anda tulis.

for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done

Atau jika Anda bermaksud menggunakan ini seperti editor aliran (pelajari sed), Anda dapat membuang hasilnya ke file lain sebagai berikut.

for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done > outfile.txt

Saya telah menggunakan ini seperti yang tertulis di atas karena saya telah menggunakan file teks tempat saya membuatnya dengan satu kata per baris. (Lihat komentar) Jika Anda memiliki spasi yang Anda tidak ingin membagi kata/baris Anda, itu menjadi sedikit lebih buruk, tetapi perintah yang sama tetap berfungsi sebagai berikut:

OLDIFS=$IFS; IFS=$'\n'; for line in $(cat peptides.txt); do cmd_a.sh $line; cmd_b.py $line; done > outfile.txt; IFS=$OLDIFS

Ini hanya memberi tahu shell untuk membagi hanya pada baris baru, bukan spasi, lalu mengembalikan lingkungan ke keadaan semula. Pada titik ini, Anda mungkin ingin mempertimbangkan untuk memasukkan semuanya ke dalam skrip shell daripada memasukkan semuanya ke dalam satu baris.

Semoga berhasil!


Salah satu cara untuk melakukannya adalah:

while read p; do
  echo "$p"
done <peptides.txt

Seperti yang ditunjukkan dalam komentar, ini memiliki efek samping memangkas spasi putih di depan, menginterpretasikan urutan garis miring terbalik, dan melewatkan baris terakhir jika tidak ada linefeed penghentian. Jika ini adalah masalah, Anda dapat melakukan:

while IFS="" read -r p || [ -n "$p" ]
do
  printf '%s\n' "$p"
done < peptides.txt

Secara luar biasa, jika isi loop dapat membaca dari input standar, Anda dapat membuka file menggunakan deskriptor file yang berbeda:

while read -u 10 p; do
  ...
done 10<peptides.txt

Di sini, 10 hanyalah angka arbitrer (berbeda dari 0, 1, 2).


Linux
  1. Looping Melalui File Dengan Spasi Dalam Nama??

  2. Mengapa Skrip Bash Tidak Mengenal Alias?

  3. Mengarahkan Isi File Ke Perintah "echo"?

  1. Basa'?

  2. Ganti Nama Mass File Bash Dengan Penghitung?

  3. Bash Script Untuk Menghapus File Terlama Dari Folder A?

  1. Simpan Semua Output Terminal Ke File?

  2. Bagaimana Cara Melihat Isi Cadangan File Database Dconf?

  3. Bagaimana saya tahu nama file skrip dalam skrip Bash?