AWK,getline - 删除最后一个字段

时间:2012-09-27 13:24:50

标签: awk getline

我有一个文件:

Srednia ocen Wojciech Zieba: 3.83
Srednia ocen Jakub Pelc: 3.76
Srednia ocen Jan Resiak: 3.90

我想改进命令:

1

$ awk 'BEGIN{ while( getline $0 < "file") sub($NF,"",$0); print $0}' 
Srednia ocen Jan Resiak: 
userpc@userpc-desktop:~

2

$ awk 'BEGIN{ while( getline a < "file") sub($NF,"", a); print a}' 
Srednia ocen Jan Resiak: 3.90 
userpc@userpc-desktop:~/Pulpit$

我必须通过getline来做。我的例子只是脚本的一部分。我想删除最后一个字段并打印结果:

Srednia ocen Wojciech Zieba: 
Srednia ocen Jakub Pelc: 
Srednia ocen Jan Resiak:

感谢您的帮助。

修改

但这种方式不会打印剩余的字段:

$ awk 'BEGIN{ while( getline a < "file") {sub(/[^:]*$/,"",a); print a, $1, $3}}'
Srednia ocen Wojciech Zieba:  
Srednia ocen Jakub Pelc:  
Srednia ocen Jan Resiak:  
bolek@bolek-desktop:~/Pulpit$

此命令打印所有字段:

$ awk 'BEGIN{ while( getline $0 < "file") {sub($NF,"",$0); print $0, $1, $3}}'
Srednia ocen Wojciech Zieba:  Srednia Wojciech
Srednia ocen Jakub Pelc:  Srednia Jakub
Srednia ocen Jan Resiak:  Srednia Jan
bolek@bolek-desktop:~/Pulpit$ 

如何改进第一个命令?我想首先命令在场上共享线路。

修改-1:

我想改进命令:

awk 'BEGIN{ while( getline a < "file") {sub(/[^:]*$/,"",a); print a, $1, $3}}'

我想打印结果:

Srednia ocen Wojciech Zieba:  Srednia Wojciech
Srednia ocen Jakub Pelc:  Srednia Jakub
Srednia ocen Jan Resiak:  Srednia Jan

3 个答案:

答案 0 :(得分:1)

不需要awk,使用cut和sed:

$ cat in.txt 
Srednia ocen Wojciech Zieba: 3.83
Srednia ocen Jakub Pelc: 3.76
Srednia ocen Jan Resiak: 3.90
$ cut -d: -f1 in.txt | sed 's/$/:/'
Srednia ocen Wojciech Zieba:
Srednia ocen Jakub Pelc:
Srednia ocen Jan Resiak:

答案 1 :(得分:1)

一个awk方式:

awk -F':' '$0=$1 ":"' file

<强>测试

kent$  echo "Srednia ocen Wojciech Zieba: 3.83
Srednia ocen Jakub Pelc: 3.76
Srednia ocen Jan Resiak: 3.90"|awk -F':' '$0=$1 ":"'
Srednia ocen Wojciech Zieba:
Srednia ocen Jakub Pelc:
Srednia ocen Jan Resiak:

<强>更新

我不知道你真正想做什么,但你的{}范围有问题。也许你想要这个?

kent$  awk 'BEGIN{ while( getline $0 < "file") {sub($NF,"",$0); print $0}}' 
Srednia ocen Wojciech Zieba: 
Srednia ocen Jakub Pelc: 
Srednia ocen Jan Resiak:

如果你想引入你自己的变量,比如说a,它不知道$ NF。根据您的示例,您可以这样做:

kent$  awk 'BEGIN{ while( getline a < "file") {sub(/[^:]*$/,"",a); print a}}' 
Srednia ocen Wojciech Zieba:
Srednia ocen Jakub Pelc:
Srednia ocen Jan Resiak:

答案 2 :(得分:1)

您可以依次将a变量设置为每一行,但如果省略a $0将被设置并执行自动分割,这将允许您这样做:

awk 'BEGIN{ while( getline < "file") { $NF = ""; print $0, $1, $3 } }'

输出:

Srednia ocen Wojciech Zieba:  Srednia Wojciech
Srednia ocen Jakub Pelc:  Srednia Jakub
Srednia ocen Jan Resiak:  Srednia Jan