“bash shell”从文件中读取部分

时间:2013-07-26 04:28:18

标签: bash

我是bash脚本的新手。真正迷上了文本伙伴。无论如何我有一个txt文件,其中包含如下......

Smith:David:111 Oak St.:Colorado Springs:CO:80901
Smith:Tina:111 Oak St.:Colorado Springs:CO:80901
Martin:Steve:2233 Cascade St.:Colorado Springs:CO:80907

我正在尝试创建一个程序,将其读入并以下列格式显示。

Jane Doe
5245 Anystreet St.
Any City, State 22222

John Doe
2245 Anystreet St.
Any City, State 22222

我找不到关于使用什么命令以及如何使用它们的初学友好文档。一些景点提供了很好的深度文档,但很难遵循。我想实现sort命令并通过zipcode对其进行排序,但我无法得到一个很好的例子。有人可以帮我解决这个问题或帮助我开始吗?

----------------------------------------更多问题“已更新” - ----------------------------

感谢您的建议并且它已经大大帮助了。我用几种不同的方式写了这个程序,但是我在另一个学生做的一个例子上有几个最后的问题。不太了解代码中的所有内容。我把我的问题作为评论。

enter image description here

3 个答案:

答案 0 :(得分:4)

如果您可以使用awk

,则任务很简单
awk -F: '{print $2,$1 ORS $3 ORS $4", "$5,$6 ORS}' file

测试:

$ cat file
Smith:David:111 Oak St.:Colorado Springs:CO:80901
Smith:Tina:111 Oak St.:Colorado Springs:CO:80901
Martin:Steve:2233 Cascade St.:Colorado Springs:CO:80907

$ awk -F: '{print $2,$1 ORS $3 ORS $4", "$5,$6 ORS}' file
David Smith
111 Oak St.
Colorado Springs, CO 80901

Tina Smith
111 Oak St.
Colorado Springs, CO 80901

Steve Martin
2233 Cascade St.
Colorado Springs, CO 80907

您可以在bash中使用数组并执行:

while IFS=: read -ra line; do 
  printf "%s %s\n%s\n%s, %s %s %s\n\n" "${line[1]}" "${line[0]}" "${line[2]}" "${line[3]}" "${line[4]}" "
${line[5]}"; 
done < file

<强>输出

David Smith
111 Oak St.
Colorado Springs, CO 80901 

Tina Smith
111 Oak St.
Colorado Springs, CO 80901 

Steve Martin
2233 Cascade St.
Colorado Springs, CO 80907

答案 1 :(得分:2)

您可以将IFS设置为冒号,然后仔细利用它:

$ cat > xyz
Smith:David:111 Oak St.:Colorado Springs:CO:80901
Smith:Tina:111 Oak St.:Colorado Springs:CO:80901
Martin:Steve:2233 Cascade St.:Colorado Springs:CO:80907
$ while read line
> do (IFS=:
>     set -- $line
>     echo $2 $1
>     echo $3
>     echo $4, $5 $6
>     echo
>    )
> done < xyz
David Smith
111 Oak St.
Colorado Springs, CO 80901

Tina Smith
111 Oak St.
Colorado Springs, CO 80901

Steve Martin
2233 Cascade St.
Colorado Springs, CO 80907

$

子shell的使用是可选的,但意味着主shell中的IFS不会改变 - 通常是个好主意。

答案 2 :(得分:0)

这是一个简单的问题:

cat file | sed -r 's/(.*):(.*):(.*):(.*):(.*):(.*)/\1 \2\n\3\n\4,\5 \6\n/'