私の音楽m4a、mp3などをよりよく整理しようとしています。私はファイルにタグが付けられているので、ファイルを読み取ってファイルからアルバムやアーティスト情報を抽出し、正しいフォルダにファイルを保存するスクリプトを書くことができると思いました。私もその過程でAWKを学びたいです。
私は次のように始めました:
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{ print }'
done
出力:
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
それから:
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{ print $2 }'
done
出力:
Periphery
Angelmaker,
Meshuggah,
Varials,
Cannibal
Lamb
Ingested
Linkin
Car
Whitechapel
Divine
Ingested,
私はまだawkがどのように機能するかを理解しようとしているので、コードを書き直しました。
./*.m4a にあるファイルの場合、 info=$(tageditor get アーティストアルバム -f "${file}") prt1=$(echo "$info" | awk 'sub(/^.{22}/, " ")') prt2=$(echo "$prt1" | awk 'NR>2' ) art="$prt2" albm=$(echo "$prt2" | awk 'NR==1' ) band=$( echo "$art" | awk 'NR= =2' ) エコ "$info" エコ エコ "$prt1" エコ エコ "$prt2" エコ エコ "$albm" #ALBUM エコ エコ "$band" #ARTIST エコ
私は次のようになります: "./Do Not Look Down.m4a"のタグ情報:
- MP4/iTunes ラベルアルバム Koloss アーティスト Meshuggah, Tomas Haake, Marten Hagström, Fredrik Thordendal, Tomas Haake
/ 下を見下ろさないでください。
コロス・メソウガ、トーマス・ハッカー、マーティン・ハーグストローム、フレデリック・トーデンダル、トーマス・ハッカー
コロス
Meshuggah, Thomas Haacke, Martin Hagström, Fredrik Todendaal, Thomas Haacke
awkを使用して最後の行とその後のすべての行を削除する方法
答え1
エクスポートツールシェルコマンドラインまたはシェルスクリプトで必要な操作(メタデータに基づいてファイルを移動および名前変更することを含む)を実行できるコマンドラインツール(Perlで書かれています)。
名前の「EXIF」にだまされないでください。 EXIFデータだけでなく、画像、オーディオ、ビデオ形式から文書(DOCXやMicrosoft Office形式など)まで、さまざまなファイル形式のメタデータを読み書きできます。 ) xls、オープンオフィス形式、PDFなど
詳しくはマニュアルページをご覧ください。
を使用する代わりに自分で書いたい場合は、exiftool
次の内容を読んでください。
perl
さまざまなファイル形式のメタデータを読み書きできる複数のライブラリモジュールがあるため、このような作業にお勧めします。
画像::Exifツールこんな図書館ですね。exiftool
このプログラムは、独自のプロフェッショナルツールを作成したい人とプログラムをサポートするために開発され、現在も開発されています。
Debianを使用している場合、Image::Exiftool
これは機能しますexiftool
。sudo apt-get install libimage-exiftool-perl
他のディストリビューション用にパッケージ化されていることはほぼ確実です(たとえば、パッケージ名がCentos perl-Image-ExifTool
)。
Image::Exiftool
さまざまな種類のファイルを扱うことができるので(学ぶための努力を最大限に活用できるので)これをお勧めしますが、これが唯一のPerlライブラリではありません。その他多数があります。MP4::情報そしてオーディオ::スキャン。これら2つはdebianlibmp4-info-perl
にパッケージされていますlibaudio-scan-perl
。
Perlはディレクトリの作成やファイル名の変更などの操作も実行できます。シェルとは異なり、ファイル名と変数の引用符、スペース、またはシェルのメタ文字に関する問題はありません。シェルコードとawkコードでは、これらの問題のいくつかはすでに発生しており、これはメディアファイルでよく見られる長いファイル名とメタデータで発生する深刻な問題です。これはたくさんperl
シェルやで書くよりも簡単で、awk
シェル以外の言語で書くとエラーが発生する可能性も少なくなります。
perl
はawk
UNIX環境の一部として作成されました。これはしばしば「スイスのチェーンソー」とも呼ばれ、すべての一般的なUNIXツール(、、、、などgrep
)の機能を1つの言語にまとめます。sed
tr
awk
cut
Perlは、Cに似た構文の基本的な理解があれば、習得しやすく手続き型プログラミングスタイルとオプションのオブジェクト指向プログラミングスタイルを組み合わせています。 今Perlを学ぶPerlに関する多くの情報と最も重要なPerl関連サイトへのリンクがある良い出発点です。彼ら「Perl初心者」オンラインチュートリアルとても良いです。
Perlで学ぶほとんどの内容は、awk
(awkの「CONDITION {ACTION}」ルールスタイルの文脈では言語もCに似ています)、grep
( sedのように正規表現は+と-のようなPerl演算子にsed
あります。その他のUnixツールの代わりに。s/search/replace/
re.sub(search,replace,string)
Pythonにはファイルのメタデータを処理するためのライブラリモジュールもあるので良い選択ですが、私の考えではコマンドラインの「ツール」よりも「アプリケーション」を書くのに適しています。オブジェクト指向プログラミングスタイルはほとんど必須であり(Fortran以外のほとんどすべての他の言語とは異なり)、スペースとインデントは柔軟でなく構文的に重要ではありません(つまり、インデントが間違っている場合はコードの動作が異なり、特定の種類のエラーが発生する可能性があります)検出が困難です)。一般的なプログラミングの原則と実践に加えて、Pythonで学んだことは他のUNIXツールですぐに再利用することはできません。
答え2
sub()
関数を使用して、各行の先頭から不要な部分を削除できます。
for file in ./*.m4a; do
tageditor get artist -f "$file" | awk 'sub(/^Artist */, "")'
done
また、コマンドの出力がtageditor
タブで区切られていると思いました。その場合は、awkのデフォルトのスペース(タブ/SPC)区切り文字をタブに制限してから、2番目の列を印刷できます。
for file in ./*.m4a; do
tageditor get artist -f "$file" | awk -F'\t' '/^Artist/{ print $2 }'
done
tageditor
また、このコマンドは独自に複数のファイルを読み取ることができるため、次の操作も実行できることがわかりました。
tageditor get artist -f /path/to/*.m4a | awk -F'\t' '/^Artist/{ print $2 }'
答え3
これはあなたが望むものですか(cat file
ない場所を置き換えます)?tageditor...
$ cat file | awk 'sub(/^Artist[[:space:]]+/,""){sub(/,.*/,""); print}'
Periphery
Meshuggah
Varials
Cannibal Corpse
Lamb of God
Ingested
Linkin Park
Car Bomb
Whitechapel
Divine Destruction
Ingested
文字列の先頭だけ/Artist/
でなく行のどこでも一致するので、unchanchoredを使用しないでください。Artist
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n'
Foo Bob The Artist
Artist Lamb of God
Artistically Is how we do it
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n' |
awk '/Artist/'
Foo Bob The Artist
Artist Lamb of God
Artistically Is how we do it
$ printf 'Foo\tBob The Artist\nArtist\tLamb of God\nArtistically\tIs how we do it\n' |
awk '/^Artist[[:space:]]/'
Artist Lamb of God
答え4
列1を除外できます。
for file in *.m4a; do
tageditor get artist -f "$file" | awk '/Artist/{$1=""}1'
done