basenameを使用すると、「awk for loop」は機能しません。

basenameを使用すると、「awk for loop」は機能しません。

awk経由で実行したいxyzファイルがたくさんあります。各ファイルに「_s」を追加して新しいファイルを作成したいと思います。デフォルト名の構文を正しく指定する際には、いくつかの問題があります。これが私が持っているものです。

for i in *.xyz; do awk -F" " '{printf $1 $2 $3}' > $(basename $i)_s.xyz ; done

答え1

処理されたファイルの出力を新しいファイルに書き込み、_sファイル名部分に拡張子を追加する正しい構文は次のとおりです。

for i in *.xyz; do awk -F" " '{printf $1 $2 $3}' $i > ${i%\.*}_s.xyz ; done

このセクションでは、最後の項目から最後まで文字列を${i%\.*}切り取り、拡張子を効果的に削除します。$i.

あなたの例ではを使用できますが、${i%\.xyz}これはあまり一般的ではありません。

答え2

ファイル名を "ls *.xyz" に渡して $i の名前を変更する必要があります。

for i in `ls *.xyz`; do
  mv $i $i_s
done

関連情報