检查列值以相同的顺序尴尬/bash为单位

  • 本文关键字:顺序 为单位 bash bash awk
  • 更新时间 :
  • 英文 :


我有一个输入文件:

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。该组的值是组的相同顺序。但是,在C组中,违反了该顺序(BOLD),因此输出应只是" false"。

如果C组,则遵循值的顺序,输出将为" true"。

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

!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

运行它

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

另一个解决方案:

 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" ;
}

最新更新