0

我有多个名为 split01.txt、split02.txt 等的文本文件,数据格式如下:(这就是我所拥有的)

/tmp/audio_files/n000001.wav;
/tmp/audio_files/n000002.wav;
/tmp/audio_files/n000003.wav;
/tmp/audio_files/p000004.wav;
/tmp/audio_files/p000005.wav;

我想使用从 split01.txt、split02.txt 等文件中获取的数据创建另一个文件,格式如下:(这是我希望看到的格式)

[playlist]
NumberOfEntries=5

File000001=n000001.wav
Title000001=n000001.wav

File000002=n000002.wav
Title000002=n000002.wav

File000003=n000003.wav
Title000003=n000003.wav

File000004=p000004.wav
Title000004=p000004.wav

File000005=p000005.wav
Title000005=p000005.wav

Version=2

这可以在一个实例中完成吗?我问的原因是,在初始过程完成创建音频文件后,我将从 octave/matlab 内部运行/调用命令(awk、grep、sed 等...)。

示例:我在下面的一个实例中的意思:(matlab/octave 代码)

  system(strcat({'split --lines=3600 -d '},dirpathwaveformstmp,fileallplaylistStr,{' '},dirpathwaveformstmp,'allsplit'))

这会将单个文件拆分为多个名称为 allsplit01 allsplit02 等的文件。每个文件最多只有 3600 行。

对于那些问这个问题的人,我正在为我用 octave/matlab 创建的音频文件创建播放列表文件。

有什么建议么?

4

2 回答 2

1

如果你用 Octave 编写程序,为什么不也用 Octave 编写程序呢?该语言不限于数值分析。使用 Octave 函数可以很容易地完成您想要做的事情。

filepath     = "path for input file"
playlistpath = "path for output file" 
## read file and prepare cell array for printing
files = strsplit (fileread (filepath)', "\n");
if (isempty (files{end}))
  files(end) = [];
endif
[~, names, exts] = cellfun (@fileparts, files, "UniformOutput", false);
files = strcat (names, exts);
files(2,:) = files(1,:);
files(4,:) = files(1,:);
files(1,:) = num2cell (1:columns(files))(:);
files(3,:) = num2cell (1:columns(files))(:);

## write playlist
[fid, msg] = fopen (playlistpath, "w");
if (fid < 0)
  error ("Unable to fopen %s for writing: %s", playlistpath, msg);
endif
fprintf (fid, "[playlist]\n");
fprintf (fid, "NumberOfEntries=%i\n", columns (files));
fprintf (fid, "\n");
fprintf (fid, "File%06d=%s\nTitle%06d=%s\n\n", files{:});
fprintf (fid, "Version 2");

if (fclose (fid))
  error ("Unable to fclose file %s with FID %i", playlistpath, fid);
endif
于 2013-02-23T12:41:47.400 回答
1

这是使用 awk 的一种方法:

解析.awk

BEGIN {
  print "[playlist]"
  print "NumberOfEntries=" len "\n"
  i = 1
}

{
  gsub(".*/|;", "")
  printf "File%06d=%s\n" , i, $0
  printf "Title%06d=%s\n\n", i, $0
  i++
}

END {
  print "Version 2"
}

像这样运行它:

awk -v len=$(wc -l < infile) -f parse.awk infile

输出:

[playlist]
NumberOfEntries=5

File000001=n000001.wav
Title000001=n000001.wav

File000002=n000002.wav
Title000002=n000002.wav

File000003=n000003.wav
Title000003=n000003.wav

File000004=p000004.wav
Title000004=p000004.wav

File000005=p000005.wav
Title000005=p000005.wav

Version 2
于 2013-02-22T12:36:12.927 回答