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

时间:2013-02-22 10:01:34

标签: matlab sed awk grep octave

我有多个名为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 code)

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

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

对于那些要求创建音频文件的播放列表文件的人我用octave / matlab创建。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

这是你用awk做到的一种方式:

parse.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

答案 1 :(得分: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