awk中的字段分隔符可以包含多个字符吗?

yud*_*nge 14 awk gawk

我可以使用由多个字符组成的字段分隔符吗?就像我想要将包含引号和逗号的单词分开即可.

"学校","大学","城市"

所以在这里我想把我的FS设置为",".但是当我像这样定义我的FS时,我得到了有趣的结果.这是我的代码片段.

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

Ken*_*ent 17

是的,FS可能是多个字符.用你的例子看下面的测试:

kent$  echo '"School","College","City"'|awk -F'","|^"|"$' '{for(i=1;i<=NF;i++){if($i)print $i}}'
School
College
City
Run Code Online (Sandbox Code Playgroud)


小智 8

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

也就是说:这会从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>
Run Code Online (Sandbox Code Playgroud)

现在我们应用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$
Run Code Online (Sandbox Code Playgroud)

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


小智 7

尝试

awk 'BEGIN{FS="[|,:]"}{print $1}' youFile
Run Code Online (Sandbox Code Playgroud)