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