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).