2013-02-22 74 views
0

我有多个文本文件命名为split01.txt,split02.txt等...数据格式如下:(这是我的)使用grep awk sed perl或其他东西来更改多个文本文件

/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 

Can t他在一个例子中完成?我问的原因是在初始过程完成创建音频文件之后,我将从octave/matlab内部运行/调用命令(awk,grep,sed等等)。

例如:我的意思在下面的一个实例:(MATLAB /八度代码)

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

此拆分的单个文件与名称allsplit01 allsplit02等多个文件..每个文件只有一个最多3600行。

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

有什么建议吗?

+0

提到的格式是你所拥有的格式还是你想要的格式?另一个是什么?除此之外,你可以简要地解释你正在努力完成什么(或为什么)? – 2013-02-22 10:13:05

+0

@丹尼斯我更新了问题以解决您的问题 – 2013-02-22 10:44:16

回答

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

如果你用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 
+0

看起来很有趣,我想尝试一下,但有些回来时出现错误 [〜,names,exts] = cellfun(@fileparts,files,“UniformOutput”,假);和其他几行产生错误。 – 2013-02-23 17:44:35

+0

我尝试修复另一条线,并且另一个错误出现,如索引超出矩阵维数... – 2013-02-23 17:52:56

+0

您使用的八度版本是什么?因为它在3.6.2上工作正常(甚至不是最新版本是3.6.4) – carandraug 2013-02-23 18:18:45