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

rub*_*o77 102 text-processing cut columns

我有这个输入,它显示在列中。我想获取此示例的最后一列:

[  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
...
Run Code Online (Sandbox Code Playgroud)

如果我使用

cut -d\  -f 13
Run Code Online (Sandbox Code Playgroud)

我得到

Mbits/sec
6.29
4.19
2.10
Run Code Online (Sandbox Code Playgroud)

因为有时中间会有额外的空格。

小智 146

如果我们使用tr命令和挤压选项(-sflag )将所有多个连续空格转换为单个空格,然后cut以空格为分隔符执行操作 - 我们可以访问带有数字的所需列。

参考下面截取的代码:

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

  • BSD cut 为这种情况提供了`-w`! (6认同)
  • 这可以在没有 `cat` 的情况下完成: `tr -s ' ' file | 剪切 -d ' ' -f 8` (2认同)
  • 我的“tr”版本(8.30)不接受文件,因此我需要重定向流。命令变为:`tr -s ' ' < file | cut -d ' ' -f 8` (注意 `<`)。 (2认同)

Gil*_*il' 27

从字面上回答你的问题:

sed 's/   */:/g' | cut -d : -f 5
Run Code Online (Sandbox Code Playgroud)

或者

awk -F '  +' '{print $5}'
Run Code Online (Sandbox Code Playgroud)

但如果括号中的数字达到 10 等,则不行。如果您只对数字感兴趣,则可以删除其他所有内容。

sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6
Run Code Online (Sandbox Code Playgroud)


ter*_*don 9

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

  • awk '{print $NF}' file

    in awk,NF是字段数,$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 ( 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
Run Code Online (Sandbox Code Playgroud)

这些打印倒数第二个 ( 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
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 5

您不能cut按照手册使用多次出现的空格:

输出字段由单个出现的字段分隔符分隔。

除非文本以相同的数量分隔,或者您tr用来删除多余的文本。

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

例如:

ex -s +'%norm $2Bd0' +%p +q! foo.txt
Run Code Online (Sandbox Code Playgroud)

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