从文件中读取单词并返回下一个单词

时间:2012-10-02 16:13:56

标签: perl unix awk grep sh

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

例如,我的输入文件就像

AGE1 PERSON1
AGE2 PERSON2
AGE3 PERSON3
AGE4 PERSON4

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

请帮忙,我是Shell Scripting的初学者

3 个答案:

答案 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' ')

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

  1. 包含您输入数据的文件名为people_file.txt
  2. 您要查找的人名在变量$person_name
  3. 您要存储结果的变量是$age
  4. 首先,因为我们需要使用命令来生成$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' ')
    

    希望这有点帮助=)

相关问题