我有一个这样的文件:
a,b,c,“你好,嗨”,d
我希望字段分隔符不是空格,逗号,而不是空格。 目前我有
cat file | awk'BEGIN {FS =“[^],[^]”}; {print $ 4}'
哪个应该给“你好,嗨”,但它什么都不返回。我对这个正则表达式的东西很陌生,所以任何帮助都会受到赞赏。
答案 0 :(得分:2)
呃,不,不应该给hello, hi
。实际发生的是:
a,b,c,"hello, hi",d
|| ||| || ||_|Third fied separator
|| ||| ||_______|
|| ||| | $3
|| |||_|
|| || Second field separator
|| ||
|| |+- $2 is a comma
||_|
| First field separator
|
+- $0 is empty
因此在第三个字段分隔符后,该行为空。您可以使用
验证此行为aaa,baa,caa,"hello, hi",daa
作为输入文件。
答案 1 :(得分:1)
如果您经常使用CSV文件,请考虑安装csvtool,然后您可以简单地说:
integer
它会吐出来
%
答案 2 :(得分:1)
解决方案是定义字段内容而不是字段分隔符。您需要使用gawk,因为标准awk本身没有此功能。 (在linux上,awk = gawk)
echo 'a,b,c,"hello, hi",d' \
| awk '
# define the content with FPAT
# here any non , or a encapsulate quoted content
BEGIN{ FPAT = "[^,]*|\"[^\"]*\"" }
# for showing each field
{for (i=1;i<=NF;i++) printf( "field %d: %s\n", i, $i)}
'
field 1: a
field 2: b
field 3: c
field 4: "hello, hi"
field 5: d
默认情况下,正则表达式匹配尝试始终采用尽可能长的时间,因此“..,...”比“..和/或...”更长,采用完整的引号字符串而不是部分逗号分隔的内容相同的字符串
答案 3 :(得分:1)
您还可以使用sed
:
>sed 's/.*\("[^"]*"\).*/\1/' <<< 'a,b,c,"hello, hi",d'
"hello, hi"
或grep
:
>grep -o '"[^"]*"' <<< 'a,b,c,"hello, hi",d'
"hello, hi"