io - linux - Shell for each line - 在Bash中循环浏览一个文件的内容

Shell file exist / linux / bash / loops / unix

如何使用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)'

环境变量SHELL是(来自env):

SHELL=/bin/bash
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
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

Meraj al Maksud



Answer #1

从一个有分隔符的文件中读取

#':'是这里的定界符,文件的每一行上都有三个字段
#下面设置的IFS仅限于`read`的上下文,它不影响任何其他代码
while IFS=: read -r field1 field2 field3; do
  #处理字段
  #如果该行的字段少于三个,则缺少的字段将设置为空字符串
  #如果该行具有三个以上的字段,则“ field3”将获取所有值,包括第三个字段以及定界符
done < input.txt

从另一命令的输出中读取,使用过程替换

while read -r line; do
  #处理线
done < <(command ...)
while read -r -d '' line; do
  #逻辑
  #如果需要标记该行,请使用第二个'read ... <<<“ $ line”'
done < <(find /path/to/dir -print0)

一次从一个以上的文件中读取

while read -u 3 -r line1 && read -u 4 -r line2; do
  #处理行
  #注意,由于`&&`,当我们在两个文件中达到EOF时,循环都会结束
done 3< input1.txt 4< input2.txt

将整个文件读入一个数组(Bash版本早于4)。

while read -r line; do
    my_array+=("$line")
done < my_file

如果文件以不完整的行结束(结尾缺少换行),那么。

while read -r line || [[ $line ]]; do
    my_array+=("$line")
done < my_file

将整个文件读入一个数组(Bash 4x及以后的版本)。

readarray -t my_array < my_file
mapfile -t my_array < my_file

然后

for line in "${my_array[@]}"; do
  #处理行
done