Вопрос обработки sed / awk для тяжелой базы данных csv объемом 3 ГБ - PullRequest
0 голосов
/ 12 февраля 2019

Я взял на себя ответственность позаботиться о нескольких старых ленточных базах данных LTO и подумал, что это будет хорошей возможностью для создания функциональной библиотеки и изучения некоторых сценариев bash и обработки текста одновременно.Базы данных CSV имеют длину около 30 миллионов строк и около 3 ГБ каждая.Я стал достаточно эффективно использовать grep и regex для поиска строк, но теперь я бы хотел переформатировать весь csv-файл с помощью sed / awk для еще более быстрой обработки.Это сложнее, чем я ожидал, и надеялся, что некоторые эксперты могут указать мне правильное направление.Формат базы данных csv выглядит следующим образом:

<START OF FILE>
AE19T1JA47 -

File Name,Directory Name,Size of File,Time Last Modified

Trash,,0,2013-12-20 13:38:04
RAW FOOTAGE,,0,2013-12-20 13:39:00
DAEDALUS - ARCHIVE - 122013,,0,2013-12-20 13:40:00
STAR_HAFFLEN_PORTER_ROBINSON,DAED3 - ARCHIVE - 122013,0,2013-12-20 13:40:00
STAR_JAPAN_SETTING_SUN_092413,DAED3 - ARCHIVE - 122013,0,2013-12-20 13:40:00
STAR_YTMA_090713,DAED3 - ARCHIVE - 122013,0,2013-12-20 13:40:00
Audio,DAED3 - ARCHIVE - 122013/STAR_BILLYB_PORTER_ROBINSON,0,2013-09-03 11:21:00
Footage,DAED3 - ARCHIVE - 122013/STAR_BILLYB_PORTER_ROBINSON,0,2013-12-20 13:40:00
FWN_ASPERA_TEST_FTG,RAW FOOTAGE,0,2013-12-20 13:40:00
LANA_BRISK_REWSTO_WEEKEND_CASH_121813_RAW,RAW FOOTAGE,0,2013-12-20 13:40:00
LANA_STAR_WORLD_TURNT_LOST_WORLDS_121713_RAW,RAW FOOTAGE,0,2013-12-20 13:40:00
CZECH_PILOTS_ARCHIVAL,RAW FOOTAGE,0,2013-12-20 13:40:00
STAR_CAND_ELVY_121713_RAW,RAW FOOTAGE,0,2013-12-20 13:40:00
STAR_NEWS_PROMOS_PETE_122013_RAW,RAW FOOTAGE,0,2013-12-20 13:40:00
STAR_PODCAST_STEVE_Q_NG_121913_RAW,RAW FOOTAGE,0,2013-12-20 13:40:00
A242_C035_0101MR.RDC,RAW FOOTAGE/FWN_ASPERA_TEST_FTG,0,2013-12-20 13:40:00
md5,RAW FOOTAGE/FWN_FTP_TEST_FTG/A242_C035_0101MR.RDC,0,2013-08-30 08:19:00
MVI_9292.THM,RAW FOOTAGE/STAR_CRANK_ELVY_PROMO_121613_RAW/STAR_CRANK_ELVY_BONES_PROMO_121613_A_01/DCIM/100EOS7D,18687,2013-12-13 17:16:00
._MVI_9293.MOV,RAW FOOTAGE/STAR_CRANK_ELVY_PROMO_121613_RAW/STAR_CRANK_ELVY_BONES_PROMO_121613_A_01/DCIM/100EOS7D,4096,2013-12-20 14:43:00
MVI_9286.THM,RAW FOOTAGE/STAR_CRANK_ELVY_PROMO_121613_RAW/STAR_CRANK_ELVY_BONES_PROMO_121613_A_01/DCIM/100EOS7D,11570,2013-12-13 17:06:00
._MVI_9294.THM,RAW FOOTAGE/STAR_CRANK_ELVY_PROMO_121613_RAW/STAR_CRANK_ELVY_BONES_PROMO_121613_A_01/DCIM/100EOS7D,4096,2013-12-20 14:43:00
MVI_9286.MOV,RAW FOOTAGE/STAR_CRANK_ELVY_PROMO_121613_RAW/STAR_CRANK_ELVY_BONES_PROMO_121613_A_01/DCIM/100EOS7D,387269573,2013-12-13 17:06:00
._.DS_Store,,4096,2013-12-21 16:01:00
.DS_Store,,6148,2013-12-21 16:01:00


AE19T1ML3W -

File Name,Directory Name,Size of File,Time Last Modified

Trash,,0,2013-12-21 16:21:39
DRIVE BACKUPS,,0,2013-12-21 16:27:00
STAR_00112_500GB_BOMBU_REELS,DRIVE BACKUPS,0,2013-12-21 16:27:00
STAR_LANACannesGabby_00106,DRIVE BACKUPS,0,2013-12-21 16:26:00
STAR_01113_1TB_southy_Freeski,DRIVE BACKUPS,0,2013-12-21 16:27:00
STAR 1 TB 31,DRIVE BACKUPS,0,2013-12-21 16:27:00
Media,DRIVE BACKUPS/STAR_00112_500GB_BOMBU_REELS,0,2013-12-21 16:27:00
V_BOMBU_ALLVERSIONS_20131121,DRIVE BACKUPS/STAR_00112_500GB_BOMBU_REELS/Media,0,2013-12-21 16:27:00
tabsz_LOREAL_DELIVERY_082213,DRIVE BACKUPS/STAR_LANACannesGabby_00106,0,2013-12-21 16:27:00
LANA_SIZZLE_REEL_082213,DRIVE BACKUPS/STAR_LANACannesGabby_00106,0,2013-12-21 16:27:00
43_STAR SWSW,DRIVE BACKUPS/STAR_LANACannesGabby_00106,0,2013-12-21 16:27:00
2013-03-16.bbr,DRIVE BACKUPS/STAR_LANACannesGabby_00106,0,2013-12-21 16:27:00
ADDITIONAL_tabsz_FILES,DRIVE BACKUPS/STAR_LANACannesGabby_00106,0,2013-12-21 16:27:00
Autosave Vault,DRIVE BACKUPS/STAR_LANACannesGabby_00106,0,2013-12-21 16:27:00
WADU_SATURDAY,DRIVE BACKUPS/STAR_LANACannesGabby_00106,0,2013-12-21 16:27:00


<END OF FILE>

Структурно разбитая каждая база данных csv выглядит следующим образом:

<START OF FILE>
<LTO TAPE NAME><SPACE><DASH>
<NEWLINE>
<TOC LEGEND>
<NEWLINE>
<CONTENTS OF TAPE ABOVE>
<NEWLINE>
<NEWLINE>
<NAME OF NEXT LTO TAPE><SPACE><DASH>
<NEWLINE>
<TOC LEGEND>
<NEWLINE>
<CONTENTS OF TAPE ABOVE>
<NEWLINE>
<NEWLINE>
<END OF FILE>

Я бы хотел обрезать всю базу данных, взявимя ленты LTO и добавление его в конец строки его содержимого, разделенного запятой вместо этого, что позволяет мне легче видеть, на какой ленте находится каждый файл.По сути, я хотел бы взять структуру выше и переформатировать ее в это:

<START OF FILE>
<TOC LEGEND>
<CONTENTS OF TAPE>,<RESPECTIVE TAPE NAME>
<CONTENTS OF TAPE...>,<RESEPCTIVE TAPE NAME>
...
<END OF FILE>

1 Ответ

0 голосов
/ 12 февраля 2019
awk -F, '{
 {if (/^[A-Z0-9]* -$/)
  {split($1,name," ")}
 else if (NF == 4 && $4 != "Time Last Modified")
  {print $0","name[1]}}}' tape.txt

Это может сработать, если я понимаю, что вы пытаетесь сделать правильно.Это попытается найти имя ленты с помощью регулярного выражения.Если он найдет что-то, соответствующее регулярному выражению, он разделится на пространство, чтобы просто получить имя.Затем он будет искать любую строку, которая имеет 4 поля, для которых не указано «Время последнего изменения» для 4-го поля, затем выводит строку и добавляет в конец первое значение массива имени.

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