批处理文件中的CSV格式

时间:2010-08-25 13:02:47

标签: windows regex sed

我有一个 CSV 文件,其中有很多行,如:

  

“wmiprvse.exe”,“3596”,“控制台”,“0”,“5,632 K”,“正在运行”,“NT AUTHORITY \ NETWORK SERVICE”,“0:00:00”,“N / A “

并希望将这些行更改为:

  

wmiprvse.exe,NT AUTHORITY \ NETWORK SERVICE,N / A

最好的方法是什么?


到目前为止,我有以下内容(使用cat and sed):

cat myfile | sed -e "1,2d;s/\"*//g;s/,.*,.*,.*,.*,.*,\(.*\),.*,\(.*\)/,\1,\2/"

但它没有正常工作,有什么建议吗?

5 个答案:

答案 0 :(得分:3)

您可以使用awk吗?

正如wilhelmtell和Colin指出的那样,用逗号替换每个空格都不是正确的方法,因为它也会替换像NT AUTHORITY\NETWORK SERVICE这样的字符串中的空格

改为使用

$ cat temp | awk 'BEGIN{FS = ","}{print $1","$8","$10}' | sed 's/"//g'
wmiprvse.exe,NT AUTHORITY\NETWORK SERVICE,N/A

[旧答案]

$ cat temp | awk 'BEGIN{FS = ","}{print $1, $8, $10}' | sed 's/"//g'|
  sed 's/ /,/g'

wmiprvse.exe,NT,AUTHORITY\NETWORK,SERVICE,N/A

1

awk 'BEGIN{FS = ","}{print $1, $8, $10}'

打印第1,8和10列

2

sed 's/"//g'

删除"

3

sed 's/ /,/g'

,

替换空格

答案 1 :(得分:1)

如果您可以在值中包含(转义)引号或逗号,则正则表达式不适合作业。你需要一个指定的状态机。最好的办法是用Ruby,Python,Perl等编写一个小脚本。

答案 2 :(得分:1)

我认为你想使用awk

[jkramer/sgi5k:~]# cat foo
"wmiprvse.exe","3596","Console","0","5,632 K","Running","NT AUTHORITY\NETWORK SERVICE","0:00:00","N/A"
[jkramer/sgi5k:~]# awk -F'","|"' '{print $2 "," $8 "," $10}' foo
wmiprvse.exe,NT AUTHORITY\NETWORK SERVICE,N/A

答案 3 :(得分:0)

我认为问题在于千分隔符号。我会使用剪切/粘贴来分割文件:

“wmiprvse.exe”,“3596”,“控制台”,“0”,“5,632 K”,“正在运行”,“NT AUTHORITY \ NETWORK SERVICE”,“0:00:00”,“N / A “

cat myfile | cut -d'“' - f2,14,18 | paste -d','

它将字段2,14和18剪切为“作为分隔符,然后将它们与逗号粘贴在一起作为分隔符

答案 4 :(得分:0)

从GNU win32 here获取* nix工具。它们更新了。这项工作更合适的工具是gawk,而不是sed。如果你看一下那个大规模的正则表达式,你就会理解我的意思。

gawk "{print $1,$7}" file

注意,windows cmd.exe不喜欢双引号。因此,如果你在gawk内打印并需要双引号,那么总是逃避它们,例如

gawk "{print \"hello\" }" file