2

给定以下输入:

check1;check2
check1;;check2
check1,check2

awk命令:

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

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

您如何打印选择的分隔符,即,或者不是;描述分隔符的正则表达式。;;,

如果输入是,check1;check2那么输出应该是check1;check2

4

3 回答 3

6

如果您使用的是 GNU Awk (gawk),您可以使用以下的第四个参数split()

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.

于 2013-09-21T16:44:54.223 回答
4

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

gawk '{match($0, /([^;,]*)(;+|,)(.*)/, a); print a[1], a[2], a[3]}'
于 2013-09-21T16:42:52.763 回答
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
;
;;
,
于 2013-09-21T17:50:04.300 回答