如何使用 awk 从 tageditor 的输出中只提取乐队名称?

Dar*_*ner 0 awk text-processing

我正在尝试更好地组织我的音乐 m4a、mp3 等。由于文件被标记,我想我可以制作一个脚本来读取文件并从文件中提取专辑和艺术家信息,然后将文件 mv 到正确的文件夹中。我也想在这个过程中学习一些 AWK。

我开始于:

for file in *.m4a; do
    tageditor get artist -f "$file" | awk '/Artist/{ print }'
    done
Run Code Online (Sandbox Code Playgroud)

输出:

Artist            Periphery
Artist            Meshuggah, Tomas Haake, Marten Hagström, Fredrik Thordendal,
Artist            Varials, Bryan Garris
Artist            Cannibal Corpse
Artist            Lamb of God
Artist            Ingested
Artist            Linkin Park
Artist            Car Bomb
Artist            Whitechapel
Artist            Divine Destruction
Artist            Ingested, Sean Hynes, Sam Yates, Jason Evans, Lyn Jeffs
Run Code Online (Sandbox Code Playgroud)

然后:

for file in *.m4a; do
    tageditor get artist -f "$file" | awk '/Artist/{ print $2 }'
    done
Run Code Online (Sandbox Code Playgroud)

输出:

Periphery
Angelmaker,
Meshuggah,
Varials,
Cannibal
Lamb
Ingested
Linkin
Car
Whitechapel
Divine
Ingested,
Run Code Online (Sandbox Code Playgroud)

由于 AWK 是空格分隔的,因此像 Lamb of God 这样的艺术家会被砍掉。我也得到了,那些只用一个名字但列出贡献方的艺术家。

我知道我可以用 SED 做到这一点,但我想学习一些 AWK。

cas*_*cas 8

exiftool是命令行工具(用 perl 编写),可以从 shell 命令行或 shell 脚本执行您想要的操作(包括基于元数据移动和重命名文件)。

不要被名称中的“EXIF”所迷惑,它可以读取和写入来自许多不同文件类型的元数据,而不仅仅是 EXIF 数据——从图像和音频和视频格式到诸如 docx 和xls、开放式办公格式、PDF 等。

有关详细信息,请参阅手册页。


如果您仍然想自己编写而不是使用exiftool,请继续阅读:

我建议使用这样perl的任务,因为它有几个库模块可以从各种文件格式读取(和写入)元数据。

Image::ExifTool就是这样一个库。它曾经是,现在仍然是为了支持exiftool程序和想要编写自己的专用工具的人而开发的。

如果你使用Debian,您可以同时安装Image::Exiftool库和命令行exiftool上面提到的sudo apt-get install libimage-exiftool-perl。几乎可以肯定,它已被打包用于其他发行版(例如,在 Centos 上,该包被称为perl-Image-ExifTool)。

虽然我建议Image::Exiftool因为它可以处理许多不同类型的文件(因此您可以从学习它的努力中获得最大收益),但它并不是唯一的 perl 库。还有很多其他的,包括MP4::InfoAudio::Scan。这两个在 debian上打包为libmp4-info-perllibaudio-scan-perl

Perl 还可以创建目录和重命名文件等,并且与 shell 不同,在文件名和变量中不会有任何引用、空格或 shell 元字符的问题。您已经在 shell 和 awk 代码中遇到了其中的一些问题,对于媒体文件常见的长文件名和其中的元数据,这将是一个非常严重的问题。这将是一个很多更容易在写这perl不是在任何壳或awk,少了很多容易出错把它写在比其他的外壳任何语言。

perl,如awk,被编写为 unix 环境的一部分 - 它通常被称为“瑞士军队电锯”,将所有常用的 unix 工具(grepsedtrawkcut等)的功能组合成一种语言。

如果您对类 C 语法有基本的了解,那么 perl 很容易学习,它具有混合的过程和可选的面向对象编程风格。 Learn Perl Now是一个很好的起点,其中包含大量有关 perl 的信息以及大多数与 perl 相关的重要站点的链接。他们的“新手 Perl”在线教程非常棒。

您在 perl 中学到的大部分内容都可以在awk(在 awk 的“CONDITION {ACTION}”规则样式的上下文中,该语言也类似于 C 语言)以及grepsed(与 sed、regular表达式是像 perl 中的 + 和 - 这样的运算符,而不是函数调用。例如,s/search/replace/而不是像re.sub(search,replace,string), 和其他 unix 工具。


Python 也是一个不错的选择,因为它还具有用于处理文件中的元数据的库模块,但在 IMO 中,它更适合编写“应用程序”而不是命令行“工具”。面向对象的编程风格几乎是强制性的,并且(与除 Fortran 之外的几乎所有其他语言不同)空格和缩进既不灵活又在语法上很重要(即,如果缩进不正确,代码的行为会有所不同,从而难以发现某些类型错误)。除了一般的编程原则和实践之外,你从 python 中学到的东西不会立即与其他 unix 工具重用。