Разделить столбец на несколько столбцов при наличии пустого столбца

По умолчанию, если вы передаете команды по конвейеру, оболочка bashиспользует вызов pipe (3)libc для объединения файловых дескрипторов дочерних задач. Его внутренний размер буфера по умолчанию составляет всего 64 КБ.

Однако инструмент есть

buffer

для задачи, включенной в большинство дистрибутивов. По умолчанию используется буфер размером 1 МБ, но вы можете увеличить его до любого размера. Например

grep..anything, anywhere.. | buffer -m $[1<<30] | less &

вполне вероятно. :-)У него много других приятных функций (, например, он может работать как ddили может выводить хэши в stderr после n -фрагментов байтов ), это... приложение-убийца .:-)

0
04.09.2020, 11:10
2 ответа
$ csplit -zsf file ip.txt /^$/+1 {*}
$ paste -d, file* | head -n -1
A,1,Q
B,2,W
C,,A

Из руководства:

csplit - split a file into sections determined by context lines

-z, --elide-empty-files remove empty output files

-s, --quiet, --silent do not print counts of output file sizes

-f, --prefix=PREFIX use PREFIX instead of 'xx'

paste - merge lines of files

-d, --delimiters=LIST reuse characters from LIST instead of TABs

head -n -1используется для удаления последней строки, вы также можете использоватьsed '$d'

2
18.03.2021, 23:07
$ cat tst.awk
BEGIN { RS=""; FS="\n"; OFS="," }
{
    numRows = (NF>numRows ? NF : numRows)
    numCols = colNr = NR
    for (rowNr=1; rowNr<=NF; rowNr++) {
        vals[rowNr,colNr] = $rowNr
    }
}
END {
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        for (colNr=1; colNr<=numCols; colNr++) {
            printf "%s%s", vals[rowNr,colNr], (colNr<numCols ? OFS : ORS)
        }
    }
}

.

$ awk -f tst.awk file
A,1,Q
B,2,W
C,,A

Приведенный выше код сохраняет все введенные данные в памяти, поэтому YMMV зависит от того, что вы подразумеваете под «огромным» в I have huge data-, если это всего несколько миллионов пустых -строк, -разделенных блоков, как в вашем вводе, все будет в порядке. но если это терабайты данных, то, возможно, нет.

1
18.03.2021, 23:07

Теги

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