ShellScript
Linux
MacOSX
UNIX
cut

cut コマンドで連続した空白による区切り

こんにちは。
cut コマンドは連続した空白による区切りを処理できなくて残念です1。そこで sed の助けを借りたシェルスクリプトで工夫してみました。GNU sed を利用しています(macOS では homebrew でインストール可能)。
ただし同様なことを awk, set, read を使って行ってみると、これらの方が素直かもしれません2

$ brew install gnu-sed
$ echo ' 1  2 3 ' | ./cut.sh -f2
2
$ echo ' 1  2 3 ' | awk '{print $2}'
2
$ echo ' 1  2 3 ' | set $(cat) ; echo $2
2
$ echo ' 1  2 3 ' | (read a b c ; echo $b)
2
$ echo ' 1  2 3 ' | (read -a arr ; echo ${arr[1]})
2

さらに read コマンドで複数行処理してみると、

$ echo -e ' 1  2 \n3 4' | while read a b; do echo $b; done
2
4
$ echo -e ' 1  2 \n3 4' | while read line; do set $line; echo $2; done
2
4
$ echo -e ' 1  2 \n3 4' | while read -a arr; do echo ${arr[1]}; done
2
4

複数行処理を set および xargs -L1 を使って行ってみましたが、少し苦しいです。

$ echo -e ' 1  2 \n3 4' | sed -E 's/ +$//' | xargs -L1 -I% sh -c 'set %; echo $2'
2
4
cut.sh
#!/bin/sh
for OPT in "$@"
do
  case "$OPT" in
    '-f'* )
      list="$(echo $1 | sed 's/^-f//')"
      [ -z $list ] && list="$2" && shift 1
      shift 1
      ;;
  esac
done

cat "$@" | gsed -e 's/^ \+//' | gsed -e 's/ \+/ /g' | cut -d ' ' -f $list

  1. cut はタブ区切りがデフォルトという少し珍しいコマンドです。 

  2. bashで文字列分解する時、cutやawkもいいけど、setの方が早い、けどreadが最強」という記事もありました。