1. ホーム
  2. linux

[解決済み] Bashでファイルの中身をループする

2022-03-19 09:10:28

質問

でテキストファイルの各行を反復処理するにはどうすればよいですか? バッシュ ?

このスクリプトで

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 画面への出力だけでなく)


環境変数 シェル があります(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


例外的に、もし ループのボディは標準入力から読み込むことができます の場合、別のファイル記述子を使用してファイルを開くことができます。

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

ここで、10は単なる任意の数(0、1、2とは異なる)である。