プレイリストファイルのフィールドを使用してコマンドの引数として使用する

プレイリストファイルのフィールドを使用してコマンドの引数として使用する

プレイリストファイルのコンテンツの例:

1. The fire is on - 03:50
2. Abc dge khji kkt mmy kdj - 09:20
3. Blowing in the winds  - 14:16
4. By the rivers of Babylon - 15:46
5. Waka waka it's time for africa - 20:30
6. DGF djf Kmf pffg jdkf dhf - 28:25
7. Fdsa djf | kf |- 34:25
8. Despacito despatico - 41:33
...
...
...

注文する -ffmpeg -i "a" -ss "b" -to "c" "output"

リストから開始(つまりシーケンス番号)からテキスト行の終わり(パイプも含めることができます)までは、コマンドの最後のパラメータ(「出力」位置)でなければなりません。最後のタイムスタンプは-ssパラメーターでなければならず、次の行のタイムスタンプはパラメーターのパラメーターでなければなりません。-to

これはこれと非常に似ています。質問しかし、この特別なケースに対応するためにawkコマンドを変更する方法はわかりません。

答え1

あなたがやろうとしていることは次のとおりです。

$ cat tst.awk
BEGIN {
    fmt = "ffmpeg -i \047a\047 -ss \047%s\047 -to \047%s\047 \047%s\047\n"
}
NR > 1 {
    printf fmt, beg, $NF, title
}
{
    beg = $NF
    title = $0
}
END {
    printf fmt, beg, "forever?", title
}

$ awk -f tst.awk file
ffmpeg -i 'a' -ss '03:50' -to '09:20' '1. The fire is on - 03:50'
ffmpeg -i 'a' -ss '09:20' -to '14:16' '2. Abc dge khji kkt mmy kdj - 09:20'
ffmpeg -i 'a' -ss '14:16' -to '15:46' '3. Blowing in the winds  - 14:16'
ffmpeg -i 'a' -ss '15:46' -to '20:30' '4. By the rivers of Babylon - 15:46'
ffmpeg -i 'a' -ss '20:30' -to '28:25' '5. Waka waka it's time for africa - 20:30'
ffmpeg -i 'a' -ss '28:25' -to '34:25' '6. DGF djf Kmf pffg jdkf dhf - 28:25'
ffmpeg -i 'a' -ss '34:25' -to '41:33' '7. Fdsa djf | kf |- 34:25'
ffmpeg -i 'a' -ss '41:33' -to 'forever?' '8. Despacito despatico - 41:33'

しかし、期待した結果が表示されない場合、これは単なる推測です。

出力に二重引用符の代わりに一重引用符を使用しないでください。ffmpeg後でコマンドを実行するときに、シェルが引用符内のテキストを最初に解釈しないようにするために重要です。バラよりhttps://mywiki.wooledge.org/Quotes

答え2

スクリプトはawk以下で修正されました。その他の問題:

awk -v input="a" -v to_last="55:55" '
  BEGIN {
    str="ffmpeg -i \"%s\" -ss \"%s\" -to \"%s\" \"%s\"\n"
  }
  NR>1 {
    printf str, input, ss, $NF, output
  }
  {
    ss=$NF                       # last field is the `ss` field
    $NF=""                       # clear last field
    output=$0                    # set the remaining line to output
    sub(/[-| \t]+$/, "", output) # remove blanks, `-` and `|` at the end of output
  }
  END{
    printf str, input, ss, to_last, output
  }
' playlist

...出力(プレイリストから行が削除された場合):

ffmpeg -i "a" -ss "03:50" -to "09:20" "1. The fire is on"
ffmpeg -i "a" -ss "09:20" -to "14:16" "2. Abc dge khji kkt mmy kdj"
ffmpeg -i "a" -ss "14:16" -to "15:46" "3. Blowing in the winds"
ffmpeg -i "a" -ss "15:46" -to "20:30" "4. By the rivers of Babylon"
ffmpeg -i "a" -ss "20:30" -to "28:25" "5. Waka waka it's time for africa"
ffmpeg -i "a" -ss "28:25" -to "34:25" "6. DGF djf Kmf pffg jdkf dhf"
ffmpeg -i "a" -ss "34:25" -to "41:33" "7. Fdsa djf | kf"
ffmpeg -i "a" -ss "41:33" -to "55:55" "8. Despacito despatico"

関連情報