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)
Один из вариантов — заменить все символы новой строки запятыми (, так как вам, кажется, нужны CSV в конце ), затем заменить двойные запятые новой строкой и удалить повторяющиеся пробелы. В конце транспонируйте результат с помощьюdatamash
:
tr '\n' ',' < input.dat |
sed 's/,,/\n/g' |
tr -d ' ' |
datamash --no-strict --filler='' -t ',' transpose
Использование 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,
$ 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,