web-dev-qa-db-ja.com

カットを使用して複数の空白で区切るにはどうすればよいですか?

このサンプルの最後の列を取得したいと思います。

[  3]  1.0- 2.0 sec  1.00 MBytes  8.39 Mbits/sec
[  3]  2.0- 3.0 sec   768 KBytes  6.29 Mbits/sec
[  3]  3.0- 4.0 sec   512 KBytes  4.19 Mbits/sec
[  3]  4.0- 5.0 sec   256 KBytes  2.10 Mbits/sec
...

私が使うなら

cut -d\  -f 13

私は得る

Mbits/sec
6.29
4.19
2.10

その間に時々追加のスペースがあるからです。

31
rubo77

trコマンドとsqueezeオプション(-sフラグ)を使用して、連続するすべてのスペースをすべて1つのスペースに変換し、スペースを区切り文字としてcut操作を実行します。数値を含む必要な列にアクセスできます。

以下のコードを参照してください:

cat file | tr -s ' ' | cut -d ' ' -f 8

34
Wald Schilfrohr

文字通りあなたの質問に答えるには:

sed 's/   */:/g' | cut -d : -f 5

または

awk -F '  +' '{print $5}'

かっこ内の数値が10に達した場合などは機能しません。数値のみに関心がある場合は、他のすべてを削除できます。

sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6

これらのコマンドはすべて、スペースで区切られたファイルの最後の列を印刷します。

  • awk '{print $NF}' file

    awkでは、NFはフィールドの数であり、$NFは最後のフィールドです。

  • Perl -lane 'print $F[$#F]' file

    -aは、空白のファイルを配列@Fに分割します。$#Fは配列の要素数なので、$F[$#F]は最後の要素です。 -nは、コマンドラインで指定されたファイルを読み取り、-eで渡されたスクリプトを各行に適用することを意味します。 -lは、各printステートメントに改行文字(\n)を追加するだけです。

  • sed 's/.* //g'

    すべてを最後のスペースに一致させて削除し、最後の列のみを残す単純な正規表現。

  • rev file | cut -d' ' -f 1 | rev

    revは出力を逆にします。つまり、最後のフィールドが最初になり、cutは区切り文字スペースで表示され、revはテキストを元に戻します。 連続する空白がある場合、これは機能しません

あなたの入力に基づいて、私はあなたが実際に最後の列を望んでいるのではなく、最後から2番目の列または最後の2つを望んでいると思います。その場合、これらを使用して最後の2(8.39 Mbits/sec)を印刷します。

awk '{print $(NF-1),$NF}' file 
Perl -lane 'print "$F[$#F-1] $F[$#F]"' file 
sed 's/.* \(.* .*\)/\1/' file 
rev file | cut -d' ' -f 1,2 | rev

そして、これらは最後から2番目(8.39)を印刷します:

awk '{print $(NF-1)}' file 
Perl -lane 'print $F[$#F-1]' file 
sed 's/.* \(.*\) .*/\1/' file 
rev file | cut -d' ' -f 2 | rev
5
terdon

マニュアルに従って、cutを使用して空白の複数の出現を分離することはできません。

出力フィールドは、フィールド区切り文字の単一の出現によって分離されます。

テキストが同じ量で区切られている場合、またはtrを使用して余分なテキストを削除する場合を除きます。

それ以外の場合は、awksedexなどの代替ツールを使用します。

例えば:

ex -s +'%norm $2Bd0' +%p +q! foo.txt

置換+q!-cwq変更をインプレースで保存します。

4
kenorb

次のようなPerlワンライナーを使用します。

Perl -lane 'print $F[-2]' input_file

説明:

オプション-eを指定すると、Perlインタープリターはファイルではなくインラインでスクリプトを検索します。

オプション-nを指定すると、入力(パイプからのファイルまたはSTDIN)が1行ずつ読み取られます。

オプション-lは、行を読み取った後、入力レコードセパレーター(デフォルトではOS依存、UNIXでは改行)を取り除き、すべてのprintの末尾に追加します

オプション-aを使用すると、各入力行が空白で配列@Fに分割されます。$F[-2]は最後から数えて2番目の要素であり、これは必要なフィールドです。 $F[$#F-1]を使用することもできます。ここで、$#Fは配列@Fの最後のインデックスで、読みにくくなります。

0
Timur Shtatland