テキストファイルの各行をBashでイテレートするには?
このスクリプトで
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
画面にはこのように出力されます。
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(後で $p
を使って、単にスクリーンに出力するだけでなく、もっと複雑なことをしてみたいと思います。)
環境変数SHELLは(envより)。
SHELL=/bin/bash
/bin/bash --version
で出力されます。
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
cat /proc/version
出力されました。
Linux version 2.6.18.2-34-default (geeko@buildhost) (gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)) #1 SMP Mon Nov 27 11:46:27 UTC 2006
ファイル「peptides.txt」には
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
一つの方法として
while read p; do
echo "$p"
done <peptides.txt
コメントで指摘されているように、これには先行するホワイトスペースのトリミング、バックスラッシュシーケンスの解釈、終了ラインフィードがない場合の最終行のスキップなどの副作用があります。これらが気になる場合は、次のようにします。
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
例外的に、loop body may read from standard inputの場合は、別のファイル記述子を使ってファイルを開くことができます。
while read -u 10 p; do
...
done 10<peptides.txt
ここで,10は単なる任意の数字です(0,1,2とは異なります).
cat peptides.txt | while read line
do
# do something with $line here
done
とワンライナーのバリエーションがあります。
cat peptides.txt | while read line; do something_with_$line_here; done
これらのオプションは、ファイルの最後の行が改行されていない場合、その行をスキップします。
次のようにすれば、これを回避できます。
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
選択肢1a: While loop: 一度に一行を入力します。 入力リダイレクト
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
選択肢 1b: While loop: 一度に一行ずつ。 ファイルを開き、ファイルディスクリプタ(ここではファイルディスクリプタ#4)から読み込みます。
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done