繁体   English   中英

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

[英]Using awk to remove a field ending in a certain character

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

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

$ 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

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM