web-dev-qa-db-ja.com

cutコマンドでスペースを区切り文字として使用する

cutコマンドでスペースを区切り文字として使用したいのですが。

これにはどのような構文を使用できますか?

282
Jaelebi
cut -d ' ' -f 2

ここで、2は必要なスペース区切りフィールドのフィールド番号です。

317
RichieHindle

通常、スペースを区切り文字として使用する場合は、複数のスペースを1つとして扱う必要があります。これは、コマンドの出力を解析して、いくつかの列をスペースに揃えます。 (そしてそれに対するグーグル検索がここに私を導く)

この場合、1つのcutコマンドでは不十分であり、次のものを使用する必要があります。

tr -s ' ' | cut -d ' ' -f 2

または

awk '{print $2}'
142
BeniBela

あなたも言うことができます

cut -d\  -f 2

円記号の後に2つのスペースがあることに注意してください。

34
Chas. Owens

I 発見したばかり"-d "を使うこともできます:

cut "-d "

テスト

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
4
fedorqui

データに複数のスペースがある場合、cutでは簡単にはできません。処理を簡単にするために入力を正規化すると便利です。 1つのトリックは、以下のように正規化にsedを使用することです。

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar
3
Anssi

scut 、どんなPerlの正規表現でも破るトークンとして使える、カット風のユーティリティ(よりスマートだが遅い)。空白で区切るのがデフォルトですが、複数文字の正規表現、代替の正規表現などで区切ることもできます。

scut -f='6 2 8 7' < input.file  > output.file

そのため、上記のコマンドは空白の列を分割し、(0から始まる)列6 2 8 7をこの順序で抽出します。

3
Harry Mangalam

私はsedname__、正規表現、キャプチャグループを含む答え(やや紛らわしい答えを認める)を持っています。

  • \S* - 最初のWord
  • \s* - 区切り文字
  • (\S*) - 2番目のWord - キャプチャー
  • .* - 行の残りの部分

sedname__式として、キャプチャグループ、すなわち\(および\)をエスケープする必要があります。

\1は、キャプチャされたグループ、つまり2番目のWordのコピーを返します。

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

あなたがこの答えを見たとき、それはやや混乱しています、そして、あなたは考えるかもしれませんが、なぜ気になりませんか?まあ、私はいくつかのことを願っています、 "ああ!"そしてこのパターンを使用して、単一のsedname__式で複雑なテキスト抽出の問題を解決します。

0
Stephen Quan