如何用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
特殊情况下,如果循环体可以从标准输入中读取,你可以使用不同的文件描述符打开文件。
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循环。 每次单行。 输入重定向
#!/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