如何使用cut分隔多个空格?


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您想要的还是最后两列?
terdon

1
我只想获取最后第二列,只有数字
rubo77

Answers:


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 2014年

@ rubo77为我工作。前两个示例完全符合您的标题要求。还是您也想剥离该装置?在这种情况下,请| sed 's/ .*//'在前两个示例的末尾添加。当然,还有许多其他方法可以做到这一点。
吉尔斯(Gillles)“所以-别再作恶了”

+而不是短一点*:cat test | sed's / [^。0-9] \ + /:/ g'| 切-d:-f 6
rubo77'9

@ rubo77如果您的sed支持它。GNU和BusyBox支持它,但BSD或Solaris不支持。POSIX 在ERE中指定+?,但在BRE \+\?BRE中未定义。
吉尔(Gilles)“所以,别再邪恶了”

22

如果我们使用tr命令以及squeeze选项(-s标志)将所有多个连续的空格转换为单个空格,然后cut使用空格作为定界符来执行操作–我们可以访问所需的带有数字的列。

请参阅以下代码片段:

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


4
这个答案应该更高;这是迄今为止最简单,最易读的解决方案。
卢克·戴维斯

5

这些命令将全部打印空格分隔文件的最后一列:

  • awk '{print $NF}' file

    awkNF是字段数和$NF是最后一个字段。

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

    -a将空格上的文件分割为array @F$#F即数组中元素的数量,$F[$#F]最后一个元素也是如此。该-n方法读取命令行上给定的文件,并将随脚本一起传递的脚本-e应用于每一行。-l只需\n在每个print语句中添加换行符()。

  • sed 's/.* //g'

    一个简单的正则表达式,将所有内容都匹配到最后一个空格并将其删除,仅保留最后一列。

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

    rev反转其输出,因此最后一个字段是第一个字段,cut并带有定界符空间来打印该字段rev并将文本反转为正常值。如果您有连续的空格,则此方法将无效

根据您的输入,我想您实际上并不想要最后一列,而是倒数第二或最后一列。在这种情况下,请使用以下命令打印最后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

并打印出倒数第二个(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用来删除多余的文本。

否则,使用替代工具,例如awksedex

例如:

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

替换+q!-cwq以保存更改。


0

像这样使用perl单线:

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

说明:

选项-e使perl解释器内联而不是在文件中查找脚本。

选项-n使输入(来自管道的文件或STDIN)逐行读取。

Option -l在读取行之后剥离输入记录分隔符(取决于OS,默认为UNIX上的换行符),并将其添加到每个记录的末尾print

Option -a导致每条输入行在空白处拆分为array @F,并且$F[-2]是从末尾算起的第二个元素,这是您想要的字段。您还可以使用$F[$#F-1],其中where $#F是数组的最后一个索引,@F可读性稍差。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.