Как преобразовать CSV с несколькими вложенными -элементами строки (из столбца )в новые столбцы в Awk?

Вот мое мнение :Заранее извините за многословие.

Когда мы конкретно говорим о ubifsмы всегда должны либо sync/подобные варианты.

ubifsопорыwrite-back caching

Это означает, что изменения, записанные в файлах, не попадают во флэш-память напрямую. Сначала они сохраняются в кэше страниц, а затем записываются во флэш-память. (Подробнее о write buffersдля флэш-памяти NAND в UBIFS)

Это повышает производительность файловой системы за счет уменьшения количества операций записи.

Обратите внимание, что это asynchronousповедение fs.

Как вы сказали в вопросе, когда вы монтируете UBIFS с -параметром синхронизации, изменения в файловой системеsynchronous(записываются во флэш-память каждый раз ), однако за счет снижения производительности.

Если вы работаете с asynchronousфайловыми системами, такими как ubifs, то бремя обеспечения записи во флэш-память лежит на разработчиках приложений. Вот справочная страница записи (2 ):

$ man 2 write
NOTES
   A  successful return from write() does not make any guarantee that data
   has been committed to disk.  In fact, on some buggy implementations, it
   does  not  even guarantee that space has successfully been reserved for
   the data.  The only way to be sure is to call fsync(2)  after  you  are
   done writing all your data.

Использование

sync-синхронизирует всю fs. Может быть не оптимальным

fsync-В основном выполняет свою работу

fdatasync-Сбрасываются только изменения данных, а не разрешения метаданных (). Оптимальнее, чем fsyncвозможно (не уверен)

Читайте также Хорошо читайте о fsync

В конце концов, ваши варианты:

  1. монтирование с синхронизацией -с падением производительности
  2. улучшите приложение, используя указанные выше опции sync.
  3. обрабатывать файлы размером 0 байт в приложениях
  4. создание временных файлов и их переименование позже

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

0
30.04.2021, 23:15
1 ответ
awk 'BEGIN{ FS=OFS=","; print "page,item,id,name,size,weight,glass,price" }
    $2!=""{ price=$5; data=$1 FS $2 FS $3 FS $4; desc=""; c=0; next }
          { gsub(/ ?(mm \(size\)|Weight:|kg|Glass:) ?/, "") }
    ++c<=3{ desc=(desc==""?"":desc OFS) $4; next }
    data  { print data, desc, price; data="" }
' infile

включая объяснение:

awk 'BEGIN{ FS=OFS=","; print "page,item,id,name,size,weight,glass,price" }
     #this block will be executed only once before reading any line, and does: 
            #set FS (Field Separator), OFS (Output Field Separator) to a comma character
            #print the "header" line ....

    $2!=""{ price=$5; data=$1 FS $2 FS $3 FS $4; desc=""; c=0; next }
    #this blocks will be executed only when column#2 value was not empty, and does:
            #backup column#5 into "price" variable
            #also backup columns#1~4 into "data" variable
            #reset the "desc" variable and also counter variable "c"
            #then read next line and skip processing the rest of the code 

          { gsub(/ ?(mm \(size\)|Weight:|kg|Glass:) ?/, "") }
            #this block runs for every line and replace strings above with empty string

    ++c<=3{ desc=(desc==""?"":desc OFS) $4; next }
    #this block runs at most 3reps and 
           #joining the descriptions in column#4 of every line
           #and read the next line until counter var "c" has value <=3 

     data { print data, desc, price; data="" }
     #if "data" variable has containing any data, then
           #print the data, desc, price and empty "data" variable 
' infile 
2
28.07.2021, 11:36

Теги

Похожие вопросы