Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果文件属性也可以使用shell/awk/perl包含逗号,如何使用逗号(,)拆分csv文件_Perl_Shell_Awk - Fatal编程技术网

如果文件属性也可以使用shell/awk/perl包含逗号,如何使用逗号(,)拆分csv文件

如果文件属性也可以使用shell/awk/perl包含逗号,如何使用逗号(,)拆分csv文件,perl,shell,awk,Perl,Shell,Awk,我需要使用逗号分割CSV文件,并将特定字段输出到其他CSV文件。但输入CSV文件有几个属性可以包含逗号本身。 输入CSV如下所示 输入CSV "Bond,newsssss/10172","20100411141114","abc","19530617000000" "Link","am"an\grew,123\"mn/n","20100411141114","foo" "20100411141114","foo","am"an","20100411141114" "am\",an","over1

我需要使用逗号分割CSV文件,并将特定字段输出到其他CSV文件。但输入CSV文件有几个属性可以包含逗号本身。 输入CSV如下所示

输入CSV

"Bond,newsssss/10172","20100411141114","abc","19530617000000"
"Link","am"an\grew,123\"mn/n","20100411141114","foo"
"20100411141114","foo","am"an","20100411141114"
"am\",an","over18","bob007@bob007.com","20100411141114"
所需输出如下

output.csv

"20100411141114","19530617000000"
"am"an\grew,123\"mn/n","foo"
"foo",20100411141114"
"over18","20100411141114"
我正在使用以下awk命令

   awk 'BEGIN{FS=",";OFS=","} { print $2 , $4;}' input.csv > ouput.csv
但它给了我以下的输出

newsssss/10172","abc"
"am"an\grew,"20100411141114"
"foo",20100411141114"
an","bob007@bob007.com"

我想用“,作为IFS的值,但也可以作为输入csv的一部分,因为它是用户定义的文件,并且没有特定的检查来阻止用户这样做。另一个问题是我要执行的服务器是Solaris,它只有标准的awk。这里有办法解决这个问题吗?

您可以使用这个
awk

awk -F'","' -vq='"' '{print q $2,$4}' OFS='","' file
测试:

$ awk -F'","' -vq='"' '{print q $2,$4}' OFS='","' file
"20100411141114","19530617000000"
"am"an\grew,123\"mn/n","foo"
"foo","20100411141114"
"over18","20100411141114"
注: 如果
$4
不是结束字段,则使用
q
打印


您可以使用此
awk

awk -F'","' -vq='"' '{print q $2,$4}' OFS='","' file
测试:

$ awk -F'","' -vq='"' '{print q $2,$4}' OFS='","' file
"20100411141114","19530617000000"
"am"an\grew,123\"mn/n","foo"
"foo","20100411141114"
"over18","20100411141114"
注: 如果
$4
不是结束字段,则使用
q
打印


尝试使用以下perl oneliner

perl -ne '@ar = (split /(?<=\w"),/)[1,3]; print @ar,"\n"; ' input.csv

perl-ne'@ar=(split/(?尝试使用以下perl-oneliner

perl -ne '@ar = (split /(?<=\w"),/)[1,3]; print @ar,"\n"; ' input.csv

perl-ne'@ar=(split/(?这在-if you have GNU awk中有介绍。@BenjaminW.另一个问题是我要执行的服务器是Solaris,如果要使用perl,它只有标准的awkUse
Text::CSV_XS
(为什么要重新发明轮子?)Solaris上的默认awk不是“标准awk”.恰恰相反-它是旧的、破损的awk,任何人都不能使用。最接近“标准awk”(其中“标准”=“POSIX”)Solaris上的是/usr/xpg4/bin/awk,但如果可以,请安装GNU awk,gawk,因为它具有所有POSIX标准功能和许多有用的扩展。@EdMorton感谢mate,我已经使用了/usr/xpg4/bin/awk,它现在对我来说工作正常。这在-if you have GNU awk中有介绍。@BenjaminW。我的另一个问题是我要使用的服务器ecute是Solaris,如果要使用perl,它只有标准的awkUse
Text::CSV_XS
(为什么要重新发明轮子?)Solaris上的默认awk不是“标准awk”。恰恰相反,它是旧的、破损的awk,任何人都不能使用。最接近“标准awk”(其中“标准”=“POSIX”)Solaris上的是/usr/xpg4/bin/awk,但如果可以的话,请安装GNU awk,gawk,因为它具有所有POSIX标准功能和许多有用的扩展。@EdMorton感谢mate,我已经使用了/usr/xpg4/bin/awk,它现在对我来说工作正常。这可以很好地用+1作为答案。但我还有另一个问题,我要执行的服务器是Solari它只有标准的awk,所以在那里工作不好,它用“直接执行。@fedorqui谢谢你。使用该路径工作正常。这可以很好地用+1作为答案。但我有另一个问题,我要执行的服务器是Solaris,它只有标准awk,因此在那里工作不好。它正在用“直接。@fedorqui谢谢你,伙计..使用这条路径很好。它正以我想要的方式工作。+1。非常感谢。如果你能再多解释一点,会更有帮助。它正以我想要的方式工作。+1。非常感谢。如果你能再多解释一点,会更有帮助。