おひとり

できる限りひとりで楽しむための情報やプログラミング情報など。

xargsにテキストファイルのデータを行ごとに渡して反復処理する方法

とあるバッチ処理を行う際、あらかじめテキストファイルにあるデータをxargsに流し込んでループしたいなーと思い、調べてみました。

TL;DR

I(大文字のi)オプションを使え!!

f:id:hitoridehitode:20200510141328j:plain
argが各行の文字列に置換される。

方法

以下のように、引数のデータがあらかじめ入ったテキストファイルがあります。
args.txt

aaa
bbb
ccc

何も考えずにxargsにこのテキストファイルを入力してやると、、、

cat args.txt | xargs echo line is 

すると、

line is aaa bbb ccc

となります。これは期待した結果ではありません。

そこで、I(大文字のi)オプションを使います。

cat args.txt | xargs -I arg echo line is arg

すると、

line is aaa
line is bbb
line is ccc

一行ずつ変換されます。

f:id:hitoridehitode:20200510141328j:plain
argが各行の文字列に置換される。

ちなみに、Iオプションに指定する文字列は以下のようにしている例もありました。

cat args.txt | xargs -I {} echo line is {}

ここら辺は可読性を意識する必要があるか、みたいな各事情に応じて使い分けてもいいかなと思いました。

おまけ - pオプション

こう言う「変換して実行する」という例は、事前に正しく変換されたか確認したいです。
そこでpオプションを使うことができます。
pオプションを使うことで、変換後のコマンドが表示され、実行するかどうかを選択することができます。

f:id:hitoridehitode:20200510141439j:plain
pオプションで実行するか事前に確認できる
早速ためしてみます。

cat args.txt | xargs -p -I arg echo line is arg

すると

echo line is aaa?...

ここでyを押せば実行されますし、nを押せば実行されません。

echo line is aaa?...y
line is aaa
echo line is bbb?...n
echo line is ccc?...n

まとめ

  • xargsのIオプションを使えばテキストファイルの内容を行ごとに処理できる。
  • pオプションを使えば、事前に実行するかどうかの確認が可能。 xargs奥深い。

f:id:hitoridehitode:20200510141710j:plain