при обнаружении пустой строки перейти на новый столбец

identify -format %m file.gif[0]

%m image file format (file magic)

[0] означает первый кадр, что может помочь, если вы случайно используете его в видео, так как в противном случае он использует библиотеки ffmpeg для создания временной копии каждого кадра.

Это работает только для изображений. Я не знаю, как это сделать для общих файлов. ffmpeg возвращает 'avc1' для случайного файла mp4 (другие файлы mp4 могут возвращать другие строки, и вам все равно придется анализировать его ), и я не вижу способа перейти от этого к 'mp4 '. 'avc1' нигде нет в /usr/share/mime.

ffmpeg или, что то же самое, ffprobe перечисляет некоторые форматы файлов, используемые демультиплексором, в начале вывода. Для файла mp4 он говорит

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from...
[...]
Video: h264 (Main) (avc1 / 0x31637661)

для png это говорит

Input #0, png_pipe, from...
[...]
Video: png, rgb24(pc)

-2
18.09.2020, 10:25
3 ответа

Один из вариантов — заменить все символы новой строки запятыми (, так как вам, кажется, нужны CSV в конце ), затем заменить двойные запятые новой строкой и удалить повторяющиеся пробелы. В конце транспонируйте результат с помощьюdatamash:

tr '\n' ',' < input.dat  |
  sed 's/,,/\n/g' |
  tr -d ' ' |
  datamash --no-strict --filler='' -t ',' transpose
0
18.03.2021, 23:04

Использование GNU awk, который имеет настоящие многомерные массивы и функцию «объединения», в качестве внешней библиотеки:

gawk '
    @include "join"
    BEGIN {row=0; col=0}
    NF == 0 {col++; row=0; next}
    {data[row][col] = $1; row++}
    END {
        PROCINFO["sorted_in"] = "@ind_num_asc"
        for (r in data)
            print join(data[r], 0, col, ",")
    }
' file

выходы

q,e,23
w,r,21
e,r,1
,t,
0
18.03.2021, 23:04
$ cat tst.awk
BEGIN {
    OFS = ","
    numCols = 1
}
!NF {
    rowNr = 0
    ++numCols
    next
}
{
    vals[++rowNr,numCols] = $0
    numRows = (rowNr > numRows ? rowNr : numRows)
}
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
q,e,23
w,r,21
e,r,1
,t,
0
18.03.2021, 23:04

Теги

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