Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

こんにちは。
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が最強」という記事もありました。 

kkdd
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away