2013-09-17 2 views
4

у меня есть файл .csv с более чем 500 000 строк, что мне нужно:Найти и заменить с использованием пространствами Sed Mac Terminal

  1. найти все последовательности «пространство двойных кавычек пространства» и заменить ничем
  2. находит все «пространство двойных кавычках» последовательности и заменить ничем
  3. найти все двойные кавычки и заменить ничем

Пример из .CSV линии:

"DISH Hartford & New Haven (Hartford)", "206", "FBNHD", " 06028", " East Windsor Hill", "CT", "Hartford County" 

** Требуемая мощность **

DISH Hartford & New Haven (Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County 

Мне нужно удалить все двойные кавычки (") и пробелы перед и после запятых (,).

Я попытался

$ cd /Users/Leonna/Downloads/ 
$ cat bs-B2Bformat.csv | sed s/ " //g 

Это дает мне «команду неполную» больше, чем приглашение, поэтому я попытался:

$ cat bs-B2Bformat.csv | sed s/ " //g 
sed: 1: "s/": unterminated substitute pattern 
$ cat bs-B2Bformat.csv |sed s/ \" //g 
sed: 1: "s/": unterminated substitute pattern 
$ 

Есть слишком много строк для меня, чтобы изменить в Excel (Excel не загружает все строки) или даже текстовый редактор. Как я могу это исправить?

+0

отредактировал мой ответ. что должно ... – iamauser

+1

Общий комментарий - заключить скрипты 'sed' в одинарные кавычки. Например: 'sed 's /" // g''. Единственный раз, когда вы этого не делаете ... возможно ... когда сама команда должна содержать одинарные кавычки, хотя тогда вам обычно лучше писать каждый литеральный сингл цитируйте как '' \ '' ', так что вы можете написать' sed 's /' \ '' // g''. –

ответ

1

Это следует сделать это:

sed -i 's/\(\s\|\)"\(\|\s\)//g' bs-B2Bformat.csv 
+0

... но версия iamauser его намного проще читать. –

1

Это работает для меня. Это то, что вы хотите ?

sed -e 's|", "|,|g' -e 's|^"||g' -e 's|"$||g' file.csv 

echo '"DISH Hartford & New Haven (Hartford)", "206", "FBNHD", " 06028", " East Windsor Hill", "CT", "Hartford County"' | sed -e 's|", "|,|g' -e 's|^"||g' -e 's|"$||g' 

DISH Hartford & New Haven (Hartford),206,FBNHD, 06028, East Windsor Hill,CT,Hartford County 
9

here Цитируется:

Для соответствия требованиям POSIX, используйте класс символов [[: пространство:]] \ сек вместо, так как последняя является СЭД расширение GNU.

Основываясь на этом, я бы предложил следующее, которое, как указывал Jonathan Leffler, переносится через GNU и BSD-реализации.

sed -E 's/[[:space:]]?"[[:space:]]?//g' <path/to/file> 

-E флаг позволяет расширенные регулярные выражения по реализации BSD. В GNU sed он недокументирован, но, как обсуждалось, here, он обеспечивает совместимость со стандартом BSD.

Цитируется manual for BSD sed:

-E Интерпретировать регулярные выражения как расширенные (современные) регулярные выражения , а не основных регулярных выражений (BRE-х).

Применяя вышеуказанную команду на файл, содержащий следующую строку

"DISH Хартфорд & New Haven (Хартфорд)", "206", "FBNHD", "06028", "East Windsor Hill», "CT", "Хартфорд Каунти"

он дает

DISH Хартфорд & Новые Haven (Хартфорд), 206, FBNHD, 06028, East Windsor Hill, CT, Хартфорд County

+2

Это зависит от GNU 'sed «Вопрос касается Mac. С Mac' sed' вы должны указать суффикс для резервного копирования (например, -i.bak). Кроме того, Mac 'sed' не интерпретирует ERE по умолчанию, вы должны включить их с '-E'. Обратные косые черты перед вопросительными знаками тоже не нужны. Итак, на Mac это работает:' sed -E 's/[[: space:]]? "[[: space: ]]? // g' (с командами BSD и GNU 'sed') - очевидно, без перезаписи файла, но вы можете добавить' -i.bak', если хотите. –

+0

@JonathanLeffler спасибо за ввод, исправлено. – brunocodutra

+0

Это абсолютно правильный ответ. \ s не будет работать на OSX. – metaDNA

0

Один из способов заключается в использовании и его csv модуль:

import csv 
import sys 

## Open file provided as argument. 
with open(sys.argv[1], 'r') as f: 

    ## Create the csv reader and writer. Avoid to quote fields in output. 
    reader = csv.reader(f, skipinitialspace=True) 
    writer = csv.writer(sys.stdout, quoting=csv.QUOTE_NONE, escapechar='\\') 

    ## Read file line by line, remove leading and trailing white spaces and 
    ## print. 
    for row in reader: 
     row = [field.strip() for field in row] 
     writer.writerow(row) 

Выполнить это нравится:

python3 script.py csvfile 

, что урожайность:

DISH Hartford & New Haven (Hartford),206,FBNHD,06028,East Windsor Hill,CT,Hartford County 
0

Что все текущие ответы, казалось пропустить:

$ cat bs-B2Bformat.csv | sed s/ " //g 
sed: 1: "s/": unterminated substitute pattern 
$ cat bs-B2Bformat.csv |sed s/ \" //g 
sed: 1: "s/": unterminated substitute pattern 
$ 

Проблема в вышеуказанном отсутствует одиночные кавычки. Это должно было быть:

$ cat bs-B2Bformat.csv | sed 's/ " //g' 
          ^ ^

Без одинарные кавычки, Баш расщепляется на пространствах и отправляет три отдельные аргументы (ну, по крайней мере для случая \"). sed видел свой первый аргумент как s/.

Редактировать: FYI, одинарные кавычки не требуются, они просто упрощают этот случай. Если вы хотите использовать двойные кавычки, просто откройте тот, который хотите сохранить для соответствия:

$ cat bs-B2Bformat.csv | sed "s/ \" //g" 
Смежные вопросы