打印实际的字段分隔符值而不是正则表达式

时间:2013-09-21 16:32:57

标签: regex awk delimiter gawk

给出以下输入:

check1;check2
check1;;check2
check1,check2

awk命令:

awk -F';+|,' '{print $1 FS $2}'

FS应该包含选定的分隔符吗?

如何打印选择的分隔符;;;,,而不是描述分隔符的正则表达式。< / p>

如果输入为check1;check2,则输出应为check1;check2

3 个答案:

答案 0 :(得分:6)

如果您正在使用GNU Awk(gawk),您可以使用split()的第4个参数:

gawk '{split($0, a, /;+|,/, seps); print a[1] seps[1] a[2]}' file

输出:

check1;check2
check1;;check2
check1,check2

在循环中使用它也很容易处理:

gawk '{nf = split($0, a, /;+|,/, seps); for (i = 1; i <= nf; ++i) printf "%s%s", a[i], seps[i]; print ""}' file

22011,25029;;3331,25275
6740,16516;;27292,1217
13480,31488;;7947,18804
328,30623;;12470,6883

如果您只需要字段,则只需触摸a即可。分隔符将在seps中分隔,其索引与a对齐。

答案 1 :(得分:4)

我不认为awk会在任何地方存储匹配的分隔符。如果你使用GNU awk,你可以自己动手:

gawk '{match($0, /([^;,]*)(;+|,)(.*)/, a); print a[1], a[2], a[3]}'

答案 2 :(得分:2)

GNU awk为记录而非字段具有此功能,因此您也可以执行以下操作:

$ awk '{printf "%s%s",$0,RT}' RS=';+|,|\n' file
check1;check2
check1;;check2
check1,check2

RT对于给定记录的RS值匹配,您可以通过以下方式查看:

$ awk '{printf "%s",RT}' RS=';+|,|\n' file
;
;;
,