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