首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Bash中遍历文件内容

在Bash中遍历文件内容
EN

Stack Overflow用户
提问于 2009-10-06 01:52:54
回答 17查看 2.1M关注 0票数 1.7K

如何使用Bash遍历文本文件的每一行(https://en.wikipedia.org/wiki/Bash_(Unix_shell%29)?

使用此脚本:

代码语言:javascript
运行
复制
echo "Start!"
for p in (peptides.txt)
do
    echo "${p}"
done

我在屏幕上看到下面的输出:

代码语言:javascript
运行
复制
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'

(稍后,我想用$p做一些更复杂的事情,而不仅仅是输出到屏幕上。)

环境变量外壳为(来自环境):

代码语言:javascript
运行
复制
SHELL=/bin/bash

/bin/bash --version输出:

代码语言:javascript
运行
复制
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

cat /proc/version输出:

代码语言:javascript
运行
复制
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包含:

代码语言:javascript
运行
复制
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2009-10-05 18:00:20

一种方法是:

代码语言:javascript
运行
复制
while read p; do
  echo "$p"
done <peptides.txt

正如注释中所指出的,这有一些副作用,如修剪前导空格、解释反斜杠序列以及如果最后一行缺少终止换行符则跳过它。如果您关心这些问题,您可以这样做:

代码语言:javascript
运行
复制
while IFS="" read -r p || [ -n "$p" ]
do
  printf '%s\n' "$p"
done < peptides.txt

例外情况下,如果是loop body may read from standard input,则可以使用不同的文件描述符打开文件:

代码语言:javascript
运行
复制
while read -u 10 p; do
  ...
done 10<peptides.txt

这里,10只是一个任意的数字(不同于0,1,2)。

票数 2.6K
EN

Stack Overflow用户

发布于 2009-10-05 17:54:39

代码语言:javascript
运行
复制
cat peptides.txt | while read line 
do
   # do something with $line here
done

还有一行的变体:

代码语言:javascript
运行
复制
cat peptides.txt | while read line; do something_with_$line_here; done

如果没有尾随换行符,这些选项将跳过文件的最后一行。

您可以通过以下方法来避免这种情况:

代码语言:javascript
运行
复制
cat peptides.txt | while read line || [[ -n $line ]];
do
   # do something with $line here
done
票数 637
EN

Stack Overflow用户

发布于 2009-10-05 18:18:47

选项1a: While循环:一次一行:输入重定向

代码语言:javascript
运行
复制
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do 
    echo "$p"
done < "$filename"

循环选项1b: While :单行:

打开文件,从文件描述符(在本例中为文件描述符#4)中读取。

代码语言:javascript
运行
复制
#!/bin/bash
filename='peptides.txt'
exec 4<"$filename"
echo Start
while read -u4 p ; do
    echo "$p"
done
票数 186
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1521462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档