2011-10-10 133 views
0

我在UNIX shell脚本中遇到了一些问题,特别是文件读取问题。我希望最终产品是脚本将文本文件作为命令行参数,然后提取某些部分以在各种操作中使用。该文本文件应该是这样的:在UNIX中从文本文件中提取特定文本

ABC12345:John Smith:78 
DEF12345:Jane Doe:80 
GHI12345:Bob Johnson:91 

,它将继续这样,与其他几条线。现在我迄今所做提取号码后的最后一个冒号在这里是这个代码片段:

case $1 in 

    m)cat $2 | while read -r file; do 
    #gets the numbers from 0 to 100 
    current=grep [0-100] 

case语句只是因为最终用户将可以运行的程序不同的方式。然而,代码段中的主要想法是在文本文件的行尾取两位数字并将其存储在当前变量中。

其余的操作真的围绕这个想法,但是,我不完全知道如何在中间提取名称。

无论如何,任何帮助将是伟大的!请记住我对此很新颖。

+4

您应该看看awk或cut。它可以让你打印出列。为了在中间获取名称,它可以像切割一样简单-d:-f2 – frankc

+0

可能的重复[基于分隔符在bash中拆分字符串?](http://stackoverflow.com/questions/918886/split-string基础的上定界符在-的bash) –

回答

1

正如frankc所言,awk或cut可以很好地工作。你也可以拨弄IFS和(假设的Bash)阵列:

_old_ifs="$IFS" 
IFS=":" 
ID_NAME_GRADE=($LINE) 
IFS="$_old_ifs" 

echo "Hello ${ID_NAME_GRADE[1]}, your grade is ${ID_NAME_GRADE[2]}" 
1

试试这个:

 
$ while IFS=: read a b c; do echo $c; done < input.txt 

这将呼应每行的第三个字段。修改以适应您的需求。

0

有很多方法可以提取您的案例中的名称和分数。看例子:

kent$ cat t 
ABC12345:John Smith:78 
DEF12345:Jane Doe:80 
GHI12345:Bob Johnson:91 

#using awk 
kent$ awk -F: '{print "name="$2,", score="$3}' t           
name=John Smith , score=78 
name=Jane Doe , score=80 
name=Bob Johnson , score=91 

#using cat 
kent$ sed -r 's/[^:]*?:([^:]*):([0-9]*)$/name=\1, score=\2/g' t 
name=John Smith, score=78 
name=Jane Doe, score=80 
name=Bob Johnson, score=91 

#or just catch it directly with grep 
kent$ grep -Po "(?<=:)[^:]*(?=:)|(?<=:)\d+$" t 
John Smith 
78 
Jane Doe 
80 
Bob Johnson 
91 

cut也可以做到这一点。