Matlab 使用grep-awk-sed-perl或其他方法更改多个文本文件

Matlab 使用grep-awk-sed-perl或其他方法更改多个文本文件,matlab,sed,awk,grep,octave,Matlab,Sed,Awk,Grep,Octave,我有多个名为split01.txt、split02.txt等的文本文件。。。数据格式如下:(这就是我所拥有的) 我想用split01.txt、split02.txt等文件中的数据创建另一个文件。。。文件格式如下:(这是我希望看到的格式) 这可以在一个实例中实现吗?我询问的原因是,在初始过程完成创建音频文件后,我将从octave/matlab内部运行/调用命令(awk、grep、sed等) 示例:我在下面一个例子中的意思:(matlab/octave代码) 这会将单个文件拆分为多个文件,文件名为a

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

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

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

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

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

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


有什么建议吗?

这里有一种使用awk的方法:

解析.awk

按如下方式运行:

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

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

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
filepath=“输入文件的路径”
playlipath=“输出文件的路径”
##读取文件并准备单元阵列以进行打印
files=strsplit(fileread(filepath)“,\n”);
if(isempty(文件{end}))
文件(结束)=[];
恩迪夫
[~,name,exts]=cellfun(@fileparts,files,“UniformOutput”,false);
文件=strcat(名称、exts);
文件(2,:)=文件(1,:);
文件(4,:)=文件(1,:);
files(1,:)=num2cell(1:列(文件))(:);
files(3,:)=num2cell(1:列(文件))(:);
##写入播放列表
[fid,msg]=fopen(播放路径,“w”);
如果(fid<0)
错误(“无法打开%s进行写入:%s”,播放路径,消息);
恩迪夫
fprintf(fid,“[playlist]\n”);
fprintf(fid,“NumberOfEntries=%i\n”,列(文件));
fprintf(fid,“\n”);
fprintf(fid,“文件%06d=%s\n文件%06d=%s\n\n”,文件{:});
fprintf(fid,“第2版”);
如果(fclose(fid))
错误(“无法用FID%i关闭文件%s”,播放路径,FID);
恩迪夫

提到的格式是您拥有的格式,还是您想要的格式?另一个是什么?除此之外,你能简单地解释一下你想要完成什么(或者为什么)?@Dennis我更新了这个问题以解决你的问题。看起来很有趣,我想尝试一下,但有些问题返回时出现了错误[~,name,exts]=cellfun(@fileparts,files,“UniformOutput”,false);还有其他几行会产生错误。我试着修复另一行,另一个错误出现了,比如索引超过了矩阵的维数…你用的是什么八度版本?因为它在3.6.2(甚至不是最新版本3.6.4)上运行良好,所以我使用的是ubuntu的Repos3.2中的版本。4@RickT这个版本很旧。升级看见页面名为Debian,但包含Debian衍生工具(如Ubuntu)。
  system(strcat({'split --lines=3600 -d '},dirpathwaveformstmp,fileallplaylistStr,{' '},dirpathwaveformstmp,'allsplit'))
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
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