1

我是 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

我找不到关于使用哪些命令以及如何使用它们的初学者友好文档。一些景点提供了深入的文档,但很难遵循。我想实现排序命令并按邮政编码对其进行排序,但我找不到一个很好的例子。有人可以帮我解决这个问题或帮助我开始吗?

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

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

在此处输入图像描述

4

3 回答 3

5

如果您可以使用,则任务很简单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
于 2013-07-26T04:39:09.070 回答
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 的使用是可选的,但这意味着IFS在主 shell 中没有改变——通常是个好主意。

于 2013-07-26T04:48:15.670 回答
0

你这个简单的:

cat file | sed -r 's/(.*):(.*):(.*):(.*):(.*):(.*)/\1 \2\n\3\n\4,\5 \6\n/'
于 2013-07-26T05:07:46.587 回答