我假设这里的每个人都熟悉所有文本文件应以换行符结尾的格言.多年来我一直都知道这个"规则",但我一直在想 - 为什么?
如何使用Bash迭代文本文件的每一行?
使用此脚本:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Run Code Online (Sandbox Code Playgroud)
我在屏幕上看到这个输出:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
Run Code Online (Sandbox Code Playgroud)
(后来我想做一些$p
比输出到屏幕更复杂的事情.)
环境变量SHELL是(来自env):
SHELL=/bin/bash
Run Code Online (Sandbox Code Playgroud)
/bin/bash --version
输出:
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
文件peptides.txt包含:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个脚本来从文件中读取命令并执行特定命令.我希望我的脚本适用于单个输入参数,或者当参数是包含有问题参数的文件名时.
我的代码除了一个问题外,它的代码无效,它忽略了文件的最后一行.所以,如果文件如下.
file.txt的
file1
file2
Run Code Online (Sandbox Code Playgroud)
下面发布的脚本仅运行file.txt的命令
for currentJob in "$@"
do
if [[ "$currentJob" != *.* ]] #single file input arg
then
echo $currentJob
serverJobName="$( tr '[A-Z]' '[a-z]' <<< "$currentJob" )" #Change to lowercase
#run cURL job
curl -o "$currentJob"PisaInterfaces.xml http://www.ebi.ac.uk/msd-srv/pisa/cgi-bin/interfaces.pisa?"$serverJobName"
else #file with list of pdbs
echo "Reading "$currentJob
while read line; do
echo "-"$line
serverJobName="$( tr '[A-Z]' '[a-z]' <<< "$line" )"
curl -o "$line"PisaInterfaces.xml http://www.ebi.ac.uk/msd-srv/pisa/cgi-bin/interfaces.pisa?"$serverJobName"
done < "$currentJob"
fi
done
Run Code Online (Sandbox Code Playgroud)
当然,有一个显而易见的工作,在while循环后我重复循环内部的步骤以完成最后一个文件的命令,但这是不可取的,因为我在while循环中所做的任何更改都必须重复在while循环之外.我在网上搜索过,找不到有人问这个确切的问题.我确信它在那里,但我还没有找到它.
我得到的输出如下.
>testScript.sh file.txt
Reading file.txt
-file1
% …
Run Code Online (Sandbox Code Playgroud) 在 bash 脚本中,我有一个包含 shell glob 表达式的变量,我想将其扩展为匹配文件名的数组(nullglob
打开),例如
pat='dir/*.config'
files=($pat)
Run Code Online (Sandbox Code Playgroud)
即使对于$pat
(eg, pat="dir/*.config dir/*.conf
) 中的多个模式,这也很好用,但是,我不能在模式中使用转义字符。理想情况下,我希望能够做到
pat='"dir/*" dir/*.config "dir/file with spaces"'
Run Code Online (Sandbox Code Playgroud)
包含该文件,所有以和*
结尾的文件。.config
file with spaces
是否有捷径可寻?(eval
如果可能的话,没有。)
由于模式是从文件中读取的,因此我无法按照此答案(以及其他各个地方)中的建议将其直接放入数组表达式中。
编辑:
将事情放在上下文中:我想做的是逐行读取模板文件并处理所有行,例如#include pattern
. 然后使用 shell glob 解析包含内容。由于该工具是通用的,因此我希望能够包含带有空格和奇怪字符(例如*
)的文件。
“主”循环如下所示:
template_include_pat='^#include (.*)$'
while IFS='' read -r line || [[ -n "$line" ]]; do
if printf '%s' "$line" | grep -qE "$template_include_pat"; then
glob=$(printf '%s' "$line" | sed -nrE "s/$template_include_pat/\\1/p")
cwd=$(pwd -P)
cd "$targetdir" …
Run Code Online (Sandbox Code Playgroud) 我是shell脚本的新手,如果我能从下面的问题中得到一些帮助,那就太棒了.
我想逐行读取文本文件,并将该行中所有匹配的模式打印到新文本文件中的一行.
例如:
$ cat input.txt
SYSTEM ERROR: EU-1C0A Report error -- SYSTEM ERROR: TM-0401 DEFAULT Test error
SYSTEM ERROR: MG-7688 DEFAULT error -- SYSTEM ERROR: DN-0A00 Error while getting object -- ERROR: DN-0A52 DEFAULT Error -- ERROR: MG-3218 error occured in HSSL
SYSTEM ERROR: DN-0A00 Error while getting object -- ERROR: DN-0A52 DEFAULT Error
SYSTEM ERROR: EU-1C0A error Failed to fill in test report -- ERROR: MG-7688
Run Code Online (Sandbox Code Playgroud)
预期输出如下:
$ cat output.txt
EU-1C0A TM-0401
MG-7688 DN-0A00 DN-0A52 MG-3218
DN-0A00 DN-0A52 …
Run Code Online (Sandbox Code Playgroud) 我在网上搜索过这个问题,到目前为止我找到了两种方法:
while read line; do
commands
done < "$filename"
Run Code Online (Sandbox Code Playgroud)
和
for $line in $(cat $filename); do
commands
done
Run Code Online (Sandbox Code Playgroud)
如果线条有空格,这些都不起作用,例如,如果我们有这样的线条
textextext text
Run Code Online (Sandbox Code Playgroud)
它不会打印 textextext text
但
textextext
text
Run Code Online (Sandbox Code Playgroud)
它将这些事情视为一条不同的路线,我怎样才能避免这种情况发生?
bash脚本上的字符串连接对逗号","字符不起作用.
A="Hello";
B=",World";
C=$A$B
echo $C;
Run Code Online (Sandbox Code Playgroud)
它将输出打印为
你好,世界
Bash版本是:
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Run Code Online (Sandbox Code Playgroud)
相同的代码似乎在这里工作
我不确定我做错了什么,但我的 awk 命令肯定犯了一些错误。
我有两个文件,fileA 包含名称
文件A
Abhi
Roma
GiGi
KaKa
Run Code Online (Sandbox Code Playgroud)
FileB 包含其他具有名称的数据
Abhi 23 Pk
DaDa 43 Gk
Roma 33 Kk
PkPk 22 Aa
Run Code Online (Sandbox Code Playgroud)
现在,我尝试打印 fileA 中不存在的所有名称的详细信息。
for i in `cat FileA` ; do cat FileB | awk '{ if ($1!='$i') print $0_}'>> Result; done
Run Code Online (Sandbox Code Playgroud)
我得到的是
Abhi 23 Pk
DaDa 43 Gk
Roma 33 Kk
PkPk 22 Aa
Abhi 23 Pk
DaDa 43 Gk
Roma 33 Kk
PkPk 22 Aa
Abhi 23 Pk
DaDa 43 Gk
Run Code Online (Sandbox Code Playgroud)
所需输出
DaDa 43 Gk …
Run Code Online (Sandbox Code Playgroud) 这是我的数据的一个例子
ip=1.2.3.4, setup_time=05:58:38.617 GMT Tue Mar 16 2021, foo=moshe, bar=haim
ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Mar 16 2021, foo=moshe2, bar=haim2
Run Code Online (Sandbox Code Playgroud)
我希望能够按setup_time
bash 中的列进行排序。我知道我不能使用,sort
因为 sort 只允许按字符串匹配排序,这不是一种格式,YYYY-MM-DD HH:mm:ss
因此字符串排序是不可能的。
所以任何想法将不胜感激。
谢谢你
#更新
好的,为了更好地了解我要实现的目标,我创建了以下文件,名为1
:
ip=1.2.3.4, setup_time=06:58:38.617 GMT Tue Mar 16 2021, foo=moshe, bar=haim
ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Mar 17 2021, foo=moshe2, bar=haim2
ip=2.3.4.5, setup_time=06:50:30.260 GMT Tue Mar 18 2021, foo=moshe2, bar=haim2
Run Code Online (Sandbox Code Playgroud)
所以我执行了这个:
cat 1 | sed 's/, /!/g' | sort -t '!' -k2,2
Run Code Online (Sandbox Code Playgroud)
我在这里所做的被替换,
为!
所以我可以在排序中使用分隔符,问题是排序是进行字符串排序而不是时间戳排序,所以输出是: …
假设我有一个 txt 文件,例如:
CGND_01234 CGND-HRA-00736
CGND_34563 CGND-HRA-00567
...
Run Code Online (Sandbox Code Playgroud)
如何在 bash 中为下面的行创建一个 for 循环来迭代文件中的每一行?
find ./${first_word_in_the_first_line} -name "${second_word_in_the_first_line}*.bam" -type f
find ./${first_word_in_the_second_line} -name "${second_word_in_the_second_line}*.bam" -type f
...
Run Code Online (Sandbox Code Playgroud)