awk/xargs の学習中に一部のファイルの名前を変更しようとします。私は2つの列を持つファイルを提供するコマンドを管理しました。最初の列は名前を変更したいファイルの名前、2番目の列はファイルを終了する必要がある名前です。
ファイルの内容をどのように分割しますか(好ましくはawk / xargsなどのプログラムを使用)。各列を変数として使用?
注文する
echo "foto1.JPG
foto2.JPG
foto3.JPG" | \
gawk '{ count++ }{ print $0 " " strftime("%y-%m-%d") "_" count ".JPG" }'
出力
foto1.JPG 21-11-09_1.JPG
foto2.JPG 21-11-09_2.JPG
foto3.JPG 21-11-09_3.JPG
これが私が欲しいのですが、その結果をどのように分離して活用するのかわかりません。頑張った
echo "foto1.JPG
foto2.JPG
foto3.JPG" | \
gawk '{ count++ }{ print $0 " " strftime("%y-%m-%d") "_" count ".JPG" }' | \
xargs -I% echo renaming $(echo % | awk '{ print $1 }') to $(echo % | awk '{ print $2 }') "..."
しかし、それは出力
renaming foto1.JPG 21-11-09_1.JPG to ...
renaming foto2.JPG 21-11-09_2.JPG to ...
renaming foto3.JPG 21-11-09_3.JPG to ...
これが私と衝突する理由は
echo renaming $(echo foo bar | awk '{ print $1 }') to $(echo foo bar | awk '{ print $2 }') "..."
私にください
renaming foo to bar ...
そして
echo "foto1.JPG
foto2.JPG
foto3.JPG" | \
gawk '{ count++ }{ print $0 " " strftime("%y-%m-%d") "_" count ".JPG" }' | \
xargs -I% echo this line has % in it
出力
this line has foto1.JPG 21-11-09_1.JPG in it
this line has foto2.JPG 21-11-09_2.JPG in it
this line has foto3.JPG 21-11-09_3.JPG in it
%
usingステートメントの内部に問題があるようです$( ... )
。
答え1
-I
AFAIKの一部として渡されたプレースホルダの内容を分割することはできません。ここで個々の引数を処理するには、シェルコンテキストを導入する必要があります。
xargs -L1 sh -c 'renaming "$1" to "$2"' "$0"
このフラグは、-L1
パイプで接続された出力の複数行を一度に1つずつ取得し、内容を実行し、行全体を引数として渡します。xargs
sh -c '..'
しかし、一意の行番号を追跡するために別の変数は必要ありませんcounter
。 awkは、NR
次のように使用できる変数の現在の行番号を更新しました。
gawk '{ print $0 " " strftime("%y-%m-%d") "_" NR ".JPG" }'