【问题标题】:Checking column values are in the same order awk/bash检查列值的顺序相同 awk/bash
【发布时间】:2015-05-13 16:24:34
【问题描述】:

我有一个输入文件:

A 23
A 45
A 32
A 61
A 78
B 23
B 45
B 32
B 61
B 78
C 23
**C 32
C 45**
C 61
C 78

第一列指定一个组,第二列指定该组的一些值。

我想检查每个组的值顺序是否相同。

例如,A 组的值是 23、45、32、61、78。B 组的值顺序相同。但 C 组中的顺序违反了(粗体),因此输出应该只是“假”。

如果组 C,也遵循值的顺序,输出将为“真”。

注意第一列的组都是唯一的,没有重复的组。

【问题讨论】:

  • 示例中的组没有混合在一起。总是这样吗?
  • @KarolyHorvath 是的,团体永远不会混在一起
  • 你试过什么?解决方案可以在 bash 中吗?将值存储在数组中并顺序循环数组,当发现 int 乱序时返回 false。

标签: bash awk


【解决方案1】:
!f { a[++i] = $2 }              # save first sequence
NR>1 && $1!=p { f=1; i=1 }      # set flag and reset index on new sequence
{ p=$1 }                        # save value of first column
f && a[i++]!=$2 { m=1; exit }   # if number not in sequence, set m and exit early
END { print m?"false":"true" }  # print false or true, depending on m

awk -f script.awk file一样运行它

【讨论】:

  • 哇,这是一个了不起的解决方案!
【解决方案2】:

这个awk 应该可以工作:

awk '$1 != p {
   if (!grp1 && grp)
      grp1 = grp;
  if (grp != grp1) {
     print p " - false";
     done = 1;
     exit
  };
  grp = "";
  p = $1
}
{
   grp = grp ":" $2
}
END {
  if (!done && grp != grp1)
     print p " - false"
}' file

打印出来:

C - false

【讨论】:

    【解决方案3】:

    另一种解决方案:

     NR == 1 {
        initial = $1
        returnVal = ""
    }
    {
        if (initial == $1) {
            array[++i] = $2
        } else {
            if (anchor != $1)
                ix = 0
            anchor = $1
            if (array[++ix] != $2) {
                returnVal = 1
            }
        }
    }
    END {
        print (returnVal) ? "false" : "true" ;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2017-04-25
      • 2017-07-24
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多