好的,我是Unix新手,我正在尝试学习Unix的基础知识。我有一个文件叫adafile,我试图配置,只是玩弄。我基本上想打印第二列(即1,3,5,6,4,6,2,4)中的数字的小数点后第二位的数字。
File Output:
3.0 .91 7 36 January JAN Wayne Smith
2.8 .83 4 17 February FEB Eric Kittle
5.1 .95 8 15 March MAR Morgan Leach
9.0 .76 7 19 April APR Jane Holder
3.5 .84 4 43 October OCT Victor Carter
5.2 .98 6 13 November NOV Michael John
4.5 .86 2 8 December DEC Harry Kaka
5.7 .96 4 13 September SEP Tim Simple
如何在不使用脚本的情况下完成此操作?我尝试使用命令:nawk '{print $2}' adafile
Output:
.91
.83
.95
.76
.84
.98
.86
.96
- 但是我知道它会在第二列显示所有的内容。
我应该使用nawk命令还是有更好的命令?
如果我能得到任何帮助,我将不胜感激!
我将按照以下方式利用GNUAWK
,让file.txt
内容为
File Output:
3.0 .91 7 36 January JAN Wayne Smith
2.8 .83 4 17 February FEB Eric Kittle
5.1 .95 8 15 March MAR Morgan Leach
9.0 .76 7 19 April APR Jane Holder
3.5 .84 4 43 October OCT Victor Carter
5.2 .98 6 13 November NOV Michael John
4.5 .86 2 8 December DEC Harry Kaka
5.7 .96 4 13 September SEP Tim Simple
然后
awk 'NR>1{print $2*100%10}' file.txt
给输出
1
3
5
6
4
8
6
6
解释:对于超过第一行(NR>1
)的行,将第二个字段值乘以100
,然后取除(%
)除以10
的余数。
(在GNU Awk 5.0.1中测试)
UPDATE 1
:添加纯regex
方法:
mawk NF=NF FS='^.+[.].| .+$' OFS=
——这也可以,但副作用是左侧有额外的空间
mawk NF=2 FS='^.+[.].| .+$'
[ ] 1
3
5
6
4
8
6
6
——————————————————
gawk '$_ = substr($(_+=++_),_+--_,_--)' nawk '$-__= substr($(_=NF), _,!__)' FS='^.*[.]' mawk '$!NF = substr($(_=NF), _,!__)' FS='^.*[.]'
1
3
5
6
4
8
6
6
如果不使用脚本,我猜是:
$ cut -c7 file
1
3
5
6
4
8
6
6
从您发布的样本输入中获得发布的预期输出,但YMMV用于其他值,所以如果我是您,我会使用脚本,例如:
$ awk '{print ( match($2,/./) ? substr($2,RSTART+2,1)+0 : 0 )}' file
1
3
5
6
4
8
6
6
这将产生数字输出,即使$0中的值没有小数点或有,但后面只有1位而不是你的例子中的2位,例如:
$ cat file
3.0 .91 7 36 January JAN Wayne Smith
2.8 .8 4 17 February FEB Eric Kittle
5.7 2 4 13 September SEP Tim Simple
$ awk '{print ( match($2,/./) ? substr($2,RSTART+2,1)+0 : 0 )}' file
1
0
0