Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【シェルコマンド】xargsを使ってコマンドの出力を別のコマンドに渡して実行したい

初期設定

以下のような内容のファイルがあるとします

% cat hoge.txt
a 1 x
b 2 y
c 3 z

awkを使うと任意の列のデータを取り出せます

$2と$1に変えるとa, b, cになるはず

awk '{print $2}' hoge.txt

1
2
3

 

ファイルの中身を使ってディレクトリを作成したい

この結果を使って1と2と3というディレクトリを作りたいとして、

awk '{print $2}' hoge.txt | mkdir

としてみると・・・

mkdir: missing operand
Try 'mkdir --help' for more information.
zsh: done       awk '{print $2}' hoge.txt |
zsh: exit 1     mkdir -p

というエラーが出てうまくいきませんでした

 

これをするにはxargsというコマンドを使って、この結果をコマンドに渡します

awk '{print $2}' hoge.txt | xargs -I {} mkdir {}

これでディレクトリの作成ができました

 

-Iオプションについて

-I {}

というのは、awkからの出力を受け取って、それをパイプ後のどこに配置するかを指定できます

ちなみに {}は別になんでもOKです、-Iの後にある文字と後ろの文字が対応していればOK

(texのverb|と同じような感じ)

 

awk '{print $2}' hoge.txt | xargs -I {} mkdir {}_{}

とすると

1_1

2_2

3_3

というディレクトリができました

 

複数の変数をxargsの後のコマンドに渡したいときはどうするか不明

また必要なら調べます

 

-pオプションについて

これはドライランをするオプション

実際に実行せずに、実行したらどういうコマンドが実行されてるのか表示してくれる

 

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

 

xargsを使った他の例

12 Practical Examples of Linux Xargs Command for Beginners

webでこの記事が紹介されてて読んだけどわからん・・・

たぶん自分は使うことはなさそう