我可以使用由多个字符组成的字段分隔符吗?就像我想要在它们之间分隔包含引号和逗号的单词即可。
“学校”, “大学”, “城市”
所以在这里我想把我的FS设为“,”。但是当我像这样定义我的FS时,我得到了有趣的结果。这是我的代码片段。
awk -F\",\" '
{
for(i=1;i<=NF;i++)
{
if($i~"[a-z0-9],[a-z0-9]")
print $i
}
}' OFS=\",\" $*
答案 0 :(得分:16)
kent$ echo '"School","College","City"'|awk -F'","|^"|"$' '{for(i=1;i<=NF;i++){if($i)print $i}}'
School
College
City
答案 1 :(得分:7)
这里讨论的是,字段分隔符不仅限于多个字符,而且实际上可以是一个完整的正则表达式。
即: 这会从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美元可以打印。 这实际上非常强大,因为这意味着您不仅可以使用具有多个字符的固定模式,还可以在字段分隔符中使用正则表达式的全部功能。
答案 2 :(得分:4)
尝试
awk 'BEGIN{FS="[|,:]"}{print $1}' youFile
答案 3 :(得分:2)
使用 GNU awk 4 ,您可以轻松解析带有嵌入式分隔符和引号的* CSV *:
% 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
答案 4 :(得分:1)
是的,您可以为-F
参数使用多个字符,因为该值可以是正则表达式。例如,您可以执行以下操作:
echo "hello:::my:::friend" | gawk -F':::' '{print $3}'
将返回friend
。
-F
和nawk
(GNU awk)支持regexp作为gawk
的参数,原始awk
不支持它。在Solaris上,这一区别很重要,在Linux上它并不重要,因为awk
实际上是gawk
的链接。因此,我认为最好将awk作为gawk
调用,因为它可以跨平台工作。
答案 5 :(得分:-1)
要使用 awk 分隔多个字符,并完全以 "," 分隔,您可以在字符前添加 \\:
echo '"School","College","City"'|awk -F'\\\\"\\\\,\\\\"' '{for(i=1;i<=NF;i++){if($i)print $i}}'