20

我可以使用由多个字符组成的字段分隔符吗?就像我想分隔它们之间包含引号和逗号的单词。

“学校”、“大学”、“城市”

所以在这里我想将我的FS设置为“,”。但是当我这样定义我的 FS 时,我得到了有趣的结果。这是我的代码片段。

awk -F\",\" '
{
for(i=1;i<=NF;i++)
  {
    if($i~"[a-z0-9],[a-z0-9]") 
    print $i
  }
}' OFS=\",\"  $* 
4

6 回答 6

21

是的,FS 可以是多字符。用你的例子看下面的测试:

kent$  echo '"School","College","City"'|awk -F'","|^"|"$' '{for(i=1;i<=NF;i++){if($i)print $i}}'
School
College
City
于 2011-11-24T13:38:12.117 回答
12

这里讨论的是字段分隔符不仅限于多个字符,而且实际上可以是一个成熟的正则表达式。

也就是说:这会从 XML 片段中去除标题和周围的标签。请注意,标签格式正确,但不同。

bash-3.2$ more xml_example 
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.google.com/schemas/sitemap/0.84"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84
                  http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">
<url>
<loc>http://www.foo.com/about.html</loc>
<lastmod>2006-05-15T13:43:37Z</lastmod>
<priority>0.5000</priority>
</url>
<url>
<loc>http://www.foo.com/articles/articles.html</loc>
<lastmod>2006-06-20T23:03:36Z</lastmod>
<priority>0.5000</priority>
</url>

现在我们应用 awk 脚本打印出中间字段,使用正则表达式作为字段分隔符:

bash-3.2$ awk -F"<(/?)[a-z]+>" '{print $2}' <xml_example




http://www.foo.com/about.html
2006-05-15T13:43:37Z
0.5000


http://www.foo.com/articles/articles.html
2006-06-20T23:03:36Z
0.5000

bash-3.2$

空白行来自该行上唯一的标签,因此没有 $2 可打印。这实际上非常强大,因为这意味着您不仅可以使用具有多个字符的固定模式,还可以在字段分隔符中使用正则表达式的全部功能。

于 2012-02-08T11:01:48.950 回答
7

尝试

awk 'BEGIN{FS="[|,:]"}{print $1}' youFile
于 2013-04-02T18:23:50.833 回答
3

使用GNU awk 4,您甚至可以使用嵌入的分隔符和引号轻松解析 *CSV*s:

% cat infile 
"School",College: "My College","City, I"

% awk '{    
  for (i = 0; ++i <= NF;)
    print i, substr($i, 1, 1) == "\042" ?
      substr($i, 2, length($i) - 2) : $i
  }' FPAT='([^,]+)|(\"[^\"]+\")' infile  
1 School
2 College: "My College"
3 City, I
于 2011-11-24T14:20:23.060 回答
3

是的,您可以为参数使用多个字符,-F因为该值可以是正则表达式。例如,您可以执行以下操作:

echo "hello:::my:::friend" | gawk -F':::' '{print $3}'

这将返回friend

支持正则表达式作为参数对 and (GNU awk)-F为真,原版不支持。在 Solaris 上,这种区别很重要,在 Linux 上并不重要,因为它实际上是指向. 因此,我会说调用 awk 是最佳实践,因为这样它将跨平台工作。nawkgawkawkawkgawkgawk

于 2013-08-30T15:01:07.043 回答
-1

要使用 awk 分隔多个字符并完全使用“,”,您可以在字符前添加\\

echo '"School","College","City"'|awk -F'\\\\"\\\\,\\\\"' '{for(i=1;i<=NF;i++){if($i)print $i}}'

https://es.stackoverflow.com/questions/422811/unix-awk-separaci%c3%b3n-de-campos-por-grupo-de-caracteres/423081#423081

于 2021-01-24T17:02:21.853 回答