【问题标题】:AWK, getline - remove the last fieldAWK,getline - 删除最后一个字段
【发布时间】:2012-09-19 07:16:30
【问题描述】:

我有一个文件:

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$ 

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

EDIT-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

【问题讨论】:

    标签: awk getline


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      一种 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:
      

      更新

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

      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:
      

      【讨论】:

      • 一个很好的解决方案,但我必须通过getline来完成。我的示例只是脚本的一部分。
      • 一个很好的解决方案,但是如何改进这个例子呢?:awk 'BEGIN{while(getline a &lt; "file") sub($NF,"",a); print a}'
      • @downvoter downvote 可以,但请解释一下。我想提高我的 awk 知识。所以请分享您的意见。
      【解决方案3】:

      不需要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:
      

      【讨论】:

      • 一个很好的解决方案,但我必须通过getline来完成。我的示例只是脚本的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2013-07-29
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多