【问题标题】:Instead of null print zero in awk而不是在 awk 中打印零
【发布时间】:2021-05-04 08:07:11
【问题描述】:

我有问题。这是我的脚本

#!/bin/bash
for index in {1..100} # I do this script on 100 files, that is s why I use for loop
do
    sort -k2,2 -k1,1 eq9_x4_$index.ndx | 
    uniq -c             | 
    uniq -f2 -c         | 
    awk '
    ($1==1 && $2==4) {inner+=6} 
    ($1==2 && $2==1) {inner+=3; outer+=3} 
    ($1==2 && $2==2) {inner+=2; outer+=4} 
    ($1==3 && $2==1) {inner+=1; outer+=5} 
    ($1==4 && $2==1) {outer+=6} 
    END{print inner, outer}' >> inner_outer_water_bridges_x4.txt
done

它计算水桥并打印总和(内部和外部) 这是我的输出文件的一部分,而不是这个

9 15
2 16

8 10
4 14
 6
5 25
2 10
6 

我想要这个

9 15
2 16
0 0
8 10
4 14
0 6
5 25
2 10
6 0

如何做到这一点在awk中有什么好的解决方案吗?

【问题讨论】:

  • 打印inner+0, outer+0
  • @MarkSetchell:将(空)字符串转换为整数。好主意。
  • @Cyrus 当然是从伟大的 Ed Morton 那里学来的 :-)
  • 当然,你可以用BEGIN{inner=outer=0}初始化你的变量。
  • @Mark 你几乎可以肯定只用一个简单的 awk 命令而不是运行一个排序和 2 个 uniqs 和一个 awk 的 shell 循环来做你想做的任何事情。如果您需要帮助,请使用几个示例 eq9_x4_$index.ndx 输入文件和预期输出发布一个新问题。

标签: awk


【解决方案1】:

使用三元运算符尝试以下操作。由于此处仅提供代码示例,因此无法对其进行测试。

#!/bin/bash
for index in {1..100} # I do this script on 100 files, that is s why I use for loop
do
    sort -k2,2 -k1,1 eq9_x4_$index.ndx | 
    uniq -c             | 
    uniq -f2 -c         | 
    awk '
    ($1==1 && $2==4) {inner+=6} 
    ($1==2 && $2==1) {inner+=3; outer+=3} 
    ($1==2 && $2==2) {inner+=2; outer+=4} 
    ($1==3 && $2==1) {inner+=1; outer+=5} 
    ($1==4 && $2==1) {outer+=6} 
    END{print (inner?inner:0), (outer?outer:0)}' >> inner_outer_water_bridges_x4.txt
done

【讨论】:

    【解决方案2】:

    如果您只处理整数,您可以按照以下方式使用printf

    END{printf "%d %d\n", inner, outer}
    

    (在 GNU Awk 5.0.1 中测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多