cutコマンドでデリミタ(区切り文字)の連続を1つの区切りにできない

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