2016-04-19 2 views
-2

У меня огромный размер файла около 500MB, и каждая строка будет иметь данные, как указано ниже.Bash: проблема с размером большого размера файла в режиме vim

#vim results.txt 
{"count": 8, "time_first": 1450801456, "record": "A", "domain": "api.ai.", "ip": "54.240.166.223", "time_last": 1458561052} 
{"count": 9, "time_first": 1450801456, "record": "A", "domain": "cnn.com.", "ip": "54.240.166.223", "time_last": 1458561052} 
......... 

Всего 25 миллионов строк.

Теперь я хотел бы сохранить файл results.txt как,

8,1450801456,A,api.ai,54.240.166.223,1458561052 
9,1450801456,A,cnn.com,54.240.166.223,1458561052 
.... 

Удаляя ненужные строки, как кол, time_first, запись, домен, IP, time_last.

Прямо сейчас, В режиме vim я удаляю каждую строку. Например, я бы сделал %s/{"count": //g.

Для одной строки потребовалось больше времени, чтобы заменить ее.

Я новичок в Bash/shell, как я могу это сделать, используя sed/awk? Любые предложения, пожалуйста?

+2

Есть тысячи примеров awk и sed, которые легко найти, выполнив предварительный поиск в Google. Это не какие-то неясные библиотеки. – redFIVE

+0

. Будете ли вы получать этот тип файла один раз в день/неделю/месяц? или это одно время? Если это одно время, уверенный vim. В противном случае sed. –

+0

@JavierBuzzi Это будет частая информация (Daily), которая приходит ко мне для обработки. – Arun

ответ

4

С СЕПГ:

sed -E 's/[{ ]*"[^"]*": *|["}]//g' file 
# ^^^  ^^---- remaining double quotes and the closing bracket 
# | | |   '----- OR 
# | | '--------------- key enclosed between double quotes 
# | '-------------------- leading opening curly bracket and spaces 
# '------------------------- use ERE (Extended Regular Expression) syntax 

Другой способ: использование xidel, который включает в себя JSon анализатор:

xidel -q file -e '$json/*' | sed 'N;N;N;N;N;y/\n/,/' 
# ^  ^ ^  ^  ^---- translate newlines to commas 
#  |   |  |   '-------------- append the next five lines 
#  |   |  '------------------------ all values 
#  |   '------------------------------ for each json string 
#  '------------------------------------------ quiet mode 

короткий путь от @BeniBela, что не нужно sed присоединиться поля вместе:

xidel -q file -e '$json/join(*,",")' 
+0

xidel что-то новое для меня и учиться. Спасибо, что поделился . – Arun

+1

@Arun: обратите внимание, что xidel не является общим инструментом unix/linux и должен быть установлен. Я добавил способ, поскольку эта утилита очень полезна (для JSON, XML, HTML), мощная и толерантная. –

+0

Установит его на моей машине Linux и попытается использовать это на большинстве моих работ. Спасибо – Arun

3

Что-то рассмотреть:

$ awk -F'[{}":, ]+' -v OFS=, '{for (i=3;i<NF;i+=2) printf "%s%s", $i, (i<(NF-1)?OFS:ORS)}' file 
8,1450801456,A,api.ai.,54.240.166.223,1458561052 
9,1450801456,A,cnn.com.,54.240.166.223,1458561052 

Получить книгу Эффективное программирование Awk, 4-е издание, автор Арнольд Роббинс.

+0

Ed: Большое спасибо за ваш ответ на это. Пробовал использовать sed наконец: sed -i 's/{"count": // g; s/"time_first": // g; s/"rrtype": // g; s/"rrname": // g; s/"rdata": // g; s/"time_last": // g; s /} // g 'test.txt – Arun

+1

Спасибо за ссылку, если у меня есть время, я прочитаю ее. –

+2

@Arun нет необходимости жестко кодировать все эти текстовые строки, правильный подход с помощью ЛЮБОГО инструмента заключается в том, чтобы просто использовать их относительные позиции в каждой строке или определить регулярное выражение для выделения того, что вы хотите (или не хотите). –

Смежные вопросы