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


23

このサンプルの最後の列を取得したい:

[  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

時々、間に追加のスペースがあるためです。


最後の列はMbits/sec、あなたが望むものですか、それとも最後の2列ですか?
テルドン

1
最後の2番目の列のみを取得したい、数字のみ
-rubo77

回答:


17

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

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

または

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

しかし、カッコ内の数字が10に達した場合、それはできません。数字だけに興味があるなら、他のすべてを削除できます。

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

はい、確か数字だけが、唯一のあなたの第三の例では、正常に動作する
rubo77

@ rubo77私のために働く。最初の2つの例は、タイトルで尋ねるとおりに実行します。それとも、ユニットを剥ぎ取りたいですか?その場合、| sed 's/ .*//'最初の2つの例の最後に追加します。もちろん、他にも多くの方法があります。
ジル「SO-悪であるのをやめる」14年

+代わりに少し短くなります*:cat test | sed 's / [^。0-9] \ + /:/ g' | カット-d:-f 6
rubo77

@ rubo77 sedがそれをサポートしている場合、それはそうです。GNUおよびBusyBoxでサポートされていますが、BSDやSolarisなどではサポートされていません。POSIX指定+し、?EREではなく、葉\+\?BREでは不定。
ジル「SO-悪であるのをやめる」

22

squeezeオプション(flag)trとともにコマンドを使用して、連続する複数のスペースをすべて単一のスペースに変換し、スペースを区切り文字として使用して操作を実行すると、数字を含む必要な列にアクセスできます。-scut

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

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


4
この答えはもっと高いはずです。それははるかに最も簡単で読みやすいソリューション。
ルークデイビス

5

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

  • awk '{print $NF}' file

    awkNFフィールドの数で、$NF最後のフィールドです。

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

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

  • 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

4

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

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

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

それ以外の場合のような代替ツールを使用するawksedまたはex

例えば:

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

と置き換え+q!-cwq、変更をその場で保存します。


0

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

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

説明:

このオプション-eにより、perlインタープリターはファイル内ではなくインラインでスクリプトを検索します。

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

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

オプションでは、-a各入力行が配列に空白で分割されるようにする@F、と$F[-2]したいフィールドで最後から二番目の要素のカウント、です。を使用することもできます$F[$#F-1]。ここ$#Fで、は配列の最後のインデックスです@F。これは少し読みにくいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.