Edited at

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

while [ $# -gt 0 ]
do
case
"$1" in
'-f'* )
list="$(echo $1 | sed 's/^-f//')"
[ -z $list ] && list="$2" && shift
shift

;;
esac
done

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






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



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