我有一个 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/"
但它没有正常工作,有什么建议吗?
答案 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