使用 shell 脚本我想从文本文件中读取一个单词并返回下一列单词。
例如,我的输入文件会像
AGE1 PERSON1
AGE2 PERSON2
AGE3 PERSON3
AGE4 PERSON4
我在具有人名的 Sh 文件中有变量。我想读取输入文本文件并获取人的年龄值。
请帮忙,我是Shell脚本的初学者
一个稍微简单的解决方案是:
age=$( awk '$2==name { print $1 }' name="$name" input-file )
age=`
perl -nle'
BEGIN { $n = shift(@ARGV); }
print $1 if /^(\S+)\s+\Q$n\E$/;
' "$name" file
`
bash
在sh
模式下测试。
基于shellter的评论:
age=$(grep "$person_name" people_file.txt | cut -f1 -d' ')
我会尽力解释一切。首先,我假设一些事情(但您可以在脚本上更改它们):
people_file.txt
.$person_name
。$age
.首先,因为我们需要使用命令来生成$age
变量的值,所以我们必须使用$(
and)
运行一个命令(或一系列命令),并用它从执行命令(或多个命令)中捕获的文本替换自身。
我们首先需要找到包含人名的行。为此,我们使用 grep: grep regex file
。Grep 将file
逐行搜索,直到找到与正则表达式匹配的行regex
。在我们的例子中,我们可以简单地直接搜索人名(假设它不包含特殊字符,如句点或星号)。请注意,我们必须将变量放在双引号之间,否则在命令行中可能会拆分包含空格的人名,以便将其名字用作正则表达式,将姓氏用作文件。如果您想以不区分大小写的方式进行搜索(例如:John 将找到带有 JOHN 或 john 的行),您可以使用以下-i
标志:grep -i regex file
. 选定的行将由 grep 打印到其输出中,但我们将使用管道运算符将这些行泵入下一个命令的输入|
。
最后,我们有一行(或多行)的结果。现在我们必须提取年龄。cut 命令将从输入中读取的每一行拆分为字段,并仅打印您要求的字段。在这种情况下,我们要求第一个字段带有-f1
选项。此外,我们指定将空格字符用作命令的分隔符(即分隔字段的字符)-d1
。
如果您有多行同一个人的名字,我们需要将 grep 的输出通过管道传输到 head 命令中,这样我们就可以只拥有我们想要的行数。-n N
我们可以通过该选项告诉 head 我们想要多少行。所以如果你只想要第一场比赛:
age=$(grep "$person_name" people_file.txt | head -n 1 | cut -f1 -d' ')
希望这会有所帮助=)