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
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)
这些命令都将打印空格分隔文件的最后一列:
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)
您不能cut按照手册使用多次出现的空格:
输出字段由单个出现的字段分隔符分隔。
除非文本以相同的数量分隔,或者您tr用来删除多余的文本。
否则,请使用替代工具,例如awk、sed或ex。
例如:
ex -s +'%norm $2Bd0' +%p +q! foo.txt
Run Code Online (Sandbox Code Playgroud)
替换+q!为-cwq以就地保存更改。