CSV форматирование в пакетных файлах - PullRequest
1 голос
/ 25 августа 2010

У меня есть CSV файл с множеством строк, например:

"wmiprvse.exe", "3596", "Console", "0", "5632 K", "Running", "NT AUTHORITY \ NETWORK SERVICE", "0:00:00", "N / A «

и хотите изменить эти строки на:

wmiprvse.exe, NT AUTHORITY \ NETWORK SERVICE, н / д

Какой лучший способ сделать это?


Пока у меня есть следующее (используя cat и sed ):

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

Но это не работает должным образом, какие-либо советы?

Ответы [ 5 ]

3 голосов
/ 25 августа 2010

Можете ли вы использовать awk?

Как указывали Вильгельмтелл и Колин, замена каждого пробела запятой - неправильный способ, поскольку он также заменяет пробелы в строке, такие как 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 голос
/ 25 августа 2010

Я думаю, вы хотите использовать 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
1 голос
/ 25 августа 2010

Если вы можете иметь (экранированные) кавычки или запятые в значениях, то регулярные выражения не являются подходящим инструментом для работы.Для этого вам понадобится конечный автомат.Лучше всего написать небольшой скрипт на Ruby, Python, Perl или подобных.

0 голосов
/ 25 августа 2010

Получите ваши * nix инструменты из GNU win32 здесь .Они более обновлены.Более подходящим инструментом для этой работы является gawk, а не sed.Если вы посмотрите на это массивное регулярное выражение, вы поймете, что я имею в виду.

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

Обратите внимание, что windows cmd.exe не любит двойные кавычки.Поэтому, если вы печатаете внутри gawk и вам нужны двойные кавычки, всегда избегайте их, например,

gawk "{print \"hello\" }" file
0 голосов
/ 25 августа 2010

Я думаю, что проблема в запятой с тысячами.Я бы использовал вырезать / вставить для разделения файла:

"wmiprvse.exe", "3596", "Консоль", "0", "5632 K", "Запуск", "NT AUTHORITY \ NETWORK SERVICE"," 0:00:00 "," N / A "

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

Обрезает поля 2, 14 и 18, взяв" в качестве разделителя, а затем вставляет их вместе с запятой в качестве разделителя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...