【问题标题】:Altering multiple text files using grep awk sed perl or something else使用 grep awk sed perl 或其他东西更改多个文本文件
【发布时间】:2013-02-23 20:41:47
【问题描述】:

我有多个名为 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 创建的音频文件创建播放列表文件。

有什么建议吗?

【问题讨论】:

  • 上述格式是您拥有的格式,还是您想要的格式?另一个是什么?除此之外,您能否简要解释一下您要完成什么(或为什么)?
  • @Dennis 我更新了问题以解决您的问题

标签: matlab sed awk grep octave


【解决方案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

【讨论】:

    【解决方案2】:

    如果您使用 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
    

    【讨论】:

    • 它看起来很有趣,我想尝试一下,但有些返回错误 [~, names, exts] = cellfun (@fileparts, files, "UniformOutput", false);和其他几行产生错误。
    • 我尝试修复另一行,但又出现另一个错误,例如索引超出矩阵维度...
    • 您使用的是哪个八度版本?因为它在 3.6.2 上运行良好(这甚至不是 3.6.4 的最新版本)
    • 这可以解释我使用的是 ubuntu 的 repos 3.2.4 中的那些
    • @RickT 该版本非常旧。升级。见Octave wiki。页面名称是 Debian,但包括 Debian 衍生产品(如 Ubuntu)。
    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多