cutコマンドでデリミタ(区切り文字)の連続を1つの区切りにできない
- 2016.10.10
- 未分類
cutコマンドでは、デリミタの連続を1つの区切りとして扱えない。
できるオプションがあるのだろうと思って調べてみたが、
どうもそういう機能はなさそうで
sedで区切り文字を1つにまとめてからcutするか、
cutじゃなくてawkを使うのが一般的の様子。
一番使うコマンドを調べるというよくある例。
history | awk '{print $2}' | sort | uniq -c | sort -nr
確かにこれでやりたいことできるし、
awkは覚えておくといろいろ役に立つのだけど、
cutのようにただ列を抽出したいだけの用途の場合、
awk ‘print {$2}’
をタイプすることすらメンドクサイ。
mcut.shというシェルスクリプトを書いておきます。
(名前のセンスはないけど、my cut コマンド)
#!/bin/bash if [ ! -p /dev/stdin ]; then #入力がパイプじゃないときは何もしない exit 1 fi echo $@ | grep -q -e "^[0-9 ]*$" if [ $? -ne 0 ]; then #引数が数字とスペースでないときは引数フォーマットエラー echo "引数に使えるのは数字のみです" exit 1 fi AWK_OPT=`echo $@ | sed -e 's/\([^ ]\+\)/$\1/g' -e 's/ \+/,/g'` cat - | awk "{print $AWK_OPT}" exit 0
これで先ほどの例はこれで書ける。
history | mcut.sh 2 | sort | uniq -c | sort -nr
-
前の記事
メールの引用の中に埋もれたURLを開く 2016.01.24
-
次の記事
shell scriptでlong optionを処理する 2016.10.16