2015-07-14 15 views
0

Это выход из моего Google CSV контактов (который содержит более 1000 контактов):Заменить несколько запятых с одной один - командой Linux

A-Tech Computers Hardware,A-Tech Computers,,Hardware,,,,,,,,,,,,,,,,,,,,Low,,,* My Contacts,,,,,,,,,Home,+38733236313,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 

мне нужна команда Linux CLI заменить повторяющиеся запятые, с одной запятой, так что я получаю это:

A-Tech Computers Hardware,A-Tech Computers,Hardware,Low,* My Contacts,Home,+38733236313, 

То, что я обычно делаю в Notepad ++ является Заменить «,,» с «» шесть раз.

Я попытался с:

cat googlecontacts.txt | sed -e 's/,,/,/g' -e 's/,,/,/g' -e 's/,,/,/g' -e 's/,,/,/g' -e 's/,,/,/g' -e 's/,,/,/g' > google.txt 

Но это не работает ... Однако, когда я пытаюсь его на файлы меньшего размера (две строки), он работает ... :(

Помощь пожалуйста!

+0

Будьте осторожны, так как вы можете испортить свои (в настоящее время) хорошо сформированные CSV-данные. Если у одного из ваших контактов есть дополнительная (или меньше) информация, чем другие, вы можете получить файл, который вы не можете открыть в виде файла CSV. Возможно, вам следует манипулировать данными как CSV (используйте R, Python или любой другой язык, с которым вам удобно, включая Awk). – Peque

ответ

2

Если предположить, что линии по-прежнему соответствует после модификации (а не озабоченность вопроса)

sed 's/,\{2,\}/,/g' googlecontacts.txt > google.txt 
  • Он заменяет любое вхождение больше, чем 1 из , одним , любого места на линии
  • любого пространства между , будет рассматривать как соответствующее поле, поэтому не модифицируются

В вашей команде, вы необходимо рекурсивным изменить характер и не повторно выполнять несколько раз же (всегда есть gretear вхождения возможно) , как этот

cat googlecontacts.txt | sed ':a 
# make your change 
s/,,/,/g 
# if change occur, retry once again by returning to line :a 
t a' > google.txt 
1

Вам нужно squeeze вариант tr:

tr -s ',' < yourFile 

Вы можете увидеть его в действии, как это:

echo hello,,there,,,,I,have,,too,many,,,commas | tr -s , 
hello,there,I,have,too,many,commas 
0

Это может работать для вас (GNU СЭД):

sed 's/,,*/,/g' file 

или

sed 's/,\+/,/g' file 
Смежные вопросы