我是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对其进行排序,但我无法得到一个很好的例子。有人可以帮我解决这个问题或帮助我开始吗?
----------------------------------------更多问题“已更新” - ----------------------------
感谢您的建议并且它已经大大帮助了。我用几种不同的方式写了这个程序,但是我在另一个学生做的一个例子上有几个最后的问题。不太了解代码中的所有内容。我把我的问题作为评论。
答案 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/'