1

总的来说,我在 unix 上还是个新手,我很难弄清楚如何完成我想做的事情。对于看起来像这样的记录:

 Name:Alice,ID:2368, Hometown:columbus,bithday:03/11/1988
Name:Bob,ID:2568,Hometown:New York,bithday:04-24-1985
Name:Ted,ID:2368, Hometown:Portland,bithday:06-11-1992
Name:Mark,        ID:2218, Hometown:Palo Alto,bithday:04-23-1984
Name:Xiao,      ID:2571, hometown:Carson,bithday:07/06/1975
Name:Rain,  ID:0264, hometown:little stone,bithday:11-09-1982
Name:Susuan, ID:1261, Hometown:Menlo park,bithday:12-13-1989
Name:Zack,  ID:1594, Hometown:columbus,bithday:02-04-1984

我想删除任何以冒号结尾的列,同时不带逗号。

所以某行可能看起来像这样:

Mark 2218 Palo Alto 04-23-1984

我已经查看了一些使用 awk 的示例,到目前为止,这是我的想法:

awk 'BEGIN {FS=":"} ; {for (i=1; i<=NF; i++) 

我的思考过程基本上是遍历每一行并说:“如果该字段以冒号结尾,则将其删除并查找以冒号结尾的下一个字段,转到下一行等等。我只是不确定如何要做到这一点,我正在努力,因为到目前为止我看到的所有教程都没有做任何类似的事情。如果有人可以帮助我,我将真诚地感激它!我将非常感谢任何帮助。

4

2 回答 2

3
$ cat file
Name:Mark,        ID:2218, Hometown:Palo Alto,bithday:04-23-1984

$ awk '{sub(/^[^:]*:/,""); gsub(/,[^:]+:/," ")}1' file
Mark 2218 Palo Alto 04-23-1984

$ sed -e 's/^[^:]*://' -e 's/,[^:][^:]*:/ /g' file
Mark 2218 Palo Alto 04-23-1984
于 2013-03-23T03:42:06.357 回答
1

awk 字段分隔符可以是正则表达式(无论如何在 GNU awk 中),因此将 FS 设置为逗号或冒号,然后打印所有其他字段:

awk -v FS='[,:]' '{for(i=2; i<=NF; i+=2) {printf "%s ", $i}; print ""}'

给定您的样本输入,您将获得:

Alice 2368 columbus 03/11/1988 
Bob 2568 New York 04-24-1985 
Ted 2368 Portland 06-11-1992 
Mark 2218 Palo Alto 04-23-1984 
Xiao 2571 Carson 07/06/1975 
Rain 0264 little stone 11-09-1982 
Susuan 1261 Menlo park 12-13-1989 
Zack 1594 columbus 02-04-1984 
于 2013-03-23T04:11:42.607 回答