0

使用 shell 脚本我想从文本文件中读取一个单词并返回下一列单词。

例如,我的输入文件会像

AGE1 PERSON1
AGE2 PERSON2
AGE3 PERSON3
AGE4 PERSON4

我在具有人名的 Sh 文件中有变量。我想读取输入文本文件并获取人的年龄值。

请帮忙,我是Shell脚本的初学者

4

3 回答 3

1

一个稍微简单的解决方案是:

age=$( awk '$2==name { print $1 }' name="$name" input-file )
于 2012-10-08T16:16:38.880 回答
0
age=`
   perl -nle'
      BEGIN { $n = shift(@ARGV); }
      print $1 if /^(\S+)\s+\Q$n\E$/;
   ' "$name" file
`

bashsh模式下测试。

于 2012-10-02T16:20:45.433 回答
0

基于shellter的评论:

age=$(grep "$person_name" people_file.txt | cut -f1 -d' ')

我会尽力解释一切。首先,我假设一些事情(但您可以在脚本上更改它们):

  1. 包含您输入的数据的文件称为people_file.txt.
  2. 您要查找的人的姓名在变量中$person_name
  3. 您要存储结果的变量是$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' ')

希望这会有所帮助=)

于 2012-10-02T17:33:17.673 回答