我有一个名为“krylov_methods”的文件,其中包含如下文本:
cg - preconditioned
cgne - normal equations
nash - cg subject to constraint
stcg - another method for constraints
gmres - general minimum residual
...
我需要逐个提取 shell 脚本中每行的第一个单词(字符串),并将其用作该脚本中的命令行参数。为了提取第一个单词,我使用了以下命令:
head -1 krylov_methods | tail -1 | awk '{print $1}'
head -2 krylov_methods | tail -1 | awk '{print $1}'
head -3 krylov_methods | tail -1 | awk '{print $1}'
...
这似乎可以很好地逐行提取每行的第一个单词,但是,我需要能够将字符串存储为变量,以供将来在脚本中使用。例如,由于文件“krylov_methods”第一行的第一个单词是单词“cg”,我希望能够将“cg”存储到名为“method”的变量中。在脚本中,我希望它得到类似以下内容:
method=cg
./execute $method
是否可以存储 shell 脚本中使用的‘head’命令的结果?
答案1
像这样
#!/bin/bash
while read line; do
set -- $line
method=$1
/path/to/execute $method
done
您也可以将第一个单词读入数组。
http://www.thegeekstuff.com/2010/06/bash-array-tutorial/
选择
read
可以隔离线路的每个组件:
#!/bin/bash
while read METHOD MINUS COMMENT
do
echo "METHOD = $METHOD"
echo "COMMENT = $COMMENT"
/path/to/execute $METHOD
done
有点取决于你用这些信息做什么以及你稍后如何调用它。
答案2
事实上,经过一些实验,我发现了:
method=$(head -$i krylov_methods | tail -1 | awk '{print $1}')
execute $method
答案3
没有必要同时使用head
和tail
。AWK
可以很容易地打印你告诉它的行
$> awk -v LINE=5 'NR==LINE' /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync
您可以将其转换为脚本中的函数bash
(如果文件包含空格或特殊字符,请记住引用文件的完整或部分路径):
print_line_number() {
awk -v LINE="$1" "NR==LINE" "$2"
}
以下是实际效果
$> print_line_number 5 /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync