2016-12-26 1 views
0

У меня есть текстовый файл, который looks like this. Я пытаюсь преобразовать его в стандартный формат с , для разделителя столбцов (который уже присутствует и \r\n для терминатора строк.Удаление пустых строк из огромного файла и создание файла с разделителем с помощью sed

Проблема заключается в том, что текущий файл похож на фиксированную ширину + запятую. имеют 167 столбцов, разделенных запятыми. Строки в текущем файле образуют несколько строк с терминатором строк в каждой строке. Этот формат не поддерживается большинством инструментов загрузки/внешней таблицы. удалить

Я попытался СЕПГ до сих пор. -

zcat myfile.txt.gz | sed 's/^\ *$/%%%/g' | xargs | sed -e 's/%%%/\n/g' -e 's/\ //g' > myfile.txt 

Вышеприведенное преобразовывало файл, и все казалось прекрасным. Но я заметил, что некоторые строки не были правильно преобразованы. Например, на некоторых строках у меня всего 117 столбцов.

Что мне недостает в sed? Есть ли лучшие/более быстрые способы сделать это? Обратите внимание, что файлы, с которыми я имею дело, составляют около 25 ГБ каждый без сжатия, и у меня их более сотни.

Sample input

Desired Output (первые две строки ввода пробы)

+0

Что ваш ожидаемый результат из этого файла? – Inian

+1

Пожалуйста, добавьте образец ввода и ваш желаемый результат для ввода этого образца ** на ваш вопрос **. – Cyrus

+0

Я обновил вопрос с примера ввода и желаемого вывода. –

ответ

1

Я бы на самом деле сделать это таким образом:

zcat myfile.txt.gz | while read line ; do if test "$line" = "" ; then printf "\r\n" ; else printf "$line" ; fi ;done > myfile.txt 

На входе образца я всегда получить 168 столбцов (167 запятые). Вы можете запустить этот код, чтобы проверить количество запятых в строке.

zcat myfile.txt.gz | while read line ; do if test "$line" = "" ; then printf "\r\n" ; else printf "$line" ; fi ;done | sed s/[^,]//g | while read a ; do echo "$a" | wc -c ; done 

Выход, полученный немного отличается от желаемого выхода вы совместно (у меня есть дополнительный 0)

0

Я закончил тем, что делал это, и это решило проблему:

zcat myfile.txt.gz | sed -r 's/[ ]+/vin/g'|tr -d '\n'|tr 'vinvin' '\n'|grep -v '^$' > myfile.txt