我在使用UNIX shell脚本时遇到了一些问题,特别是文件读取问题。我希望最终产品是脚本将文本文件作为命令行参数,然后提取某些部分以在各种操作中使用。文本文件如下所示:
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语句只是因为最终用户将能够以不同的方式运行程序。然而,代码段中的主要思想是在文本文件的行尾使用2位数字,并将其存储在当前变量中。
其余的操作实际上围绕着这个想法,但是,我并不完全确定如何在中间提取名称。
无论如何,任何帮助都会很棒!请记住,我对此很新。
答案 0 :(得分: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 :(得分:1)
试试这个:
$ while IFS=: read a b c; do echo $c; done < input.txt
这将回显每一行的第三个字段。修改以满足您的需求。
答案 2 :(得分: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也可以。
答案 3 :(得分:0)
AWk -F:'{print $ NF}'file_name