使用awk删除以某个字符结尾的字段

时间:2013-03-23 03:33:01

标签: unix awk

我对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++) 

我的思维过程基本上循环遍历每一行并说:“如果字段以冒号结束然后删除它并查找以冒号结尾的下一个字段,转到下一行,依此类推。我就是我不知道如何做到这一点,我正在努力,因为我到目前为止看到的所有教程都没有做类似的事情。如果有人能帮助我,我会真诚地感激它!我将不胜感激任何帮助所有

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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