用awk识别唯一值

时间:2014-09-26 15:14:24

标签: bash awk

我有这个txt文件:

237708978 5555120825555282
237708978 5555120825555282
237708978 5555120825555281
237708978 5555120825555281
237708978 5555120825555283
239480114 55551208255552814
239480114 55551208255552812
239480114 55551208255552812
239480114 55551208255552814
239480114 55551208255552813
239393704 55551208255552813
239393704 555512082555528133
239393704 555512082555528133
239393704 555512082555528132
239393704 555512082555528132
239393704 555512082555528132
239393704 555512082555528132
239393704 555512082555528131
239393704 555512082555528131
239393704 555512082555528133
239393704 5555120825528132
239393704 5555120825528132
239393704 5555120825528133
239393704 5555120825528132
239393704 5555120825528131
239393704 5555120825528131
239393704 5555120825528133

我希望每次第2列更改时都添加一个唯一编号的列。 我正在运行这个awk脚本(在我的代码中单行格式化):

 awk  '{ if (NR == 1) { old = $2 ; nr=1 ; print $1, nr, old }
         else
         {{ if($2 == old){ print $1, nr, $2 , old   }
            else { if (old != $2) { nr=nr+1; old=$2; print $1, nr, $2,  old;
       }}}}}' test1.txt

我得到了

237708978 1 5555120825555282 
237708978 1 5555120825555282 5555120825555282
237708978 2 5555120825555281 5555120825555281
237708978 2 5555120825555281 5555120825555281
237708978 3 5555120825555283 5555120825555283
239480114 4 55551208255552814 55551208255552814
239480114 4 55551208255552812 55551208255552814
239480114 4 55551208255552812 55551208255552814
239480114 4 55551208255552814 55551208255552814
239480114 4 55551208255552813 55551208255552814
239393704 4 55551208255552813 55551208255552814
239393704 5 555512082555528133 555512082555528133
239393704 5 555512082555528133 555512082555528133
239393704 5 555512082555528132 555512082555528133
239393704 5 555512082555528132 555512082555528133
239393704 5 555512082555528132 555512082555528133
239393704 5 555512082555528132 555512082555528133
239393704 5 555512082555528131 555512082555528133
239393704 5 555512082555528131 555512082555528133
239393704 5 555512082555528133 555512082555528133
239393704 6 5555120825528132 5555120825528132
239393704 6 5555120825528132 5555120825528132
239393704 7 5555120825528133 5555120825528133
239393704 8 5555120825528132 5555120825528132
239393704 9 5555120825528131 5555120825528131
239393704 9 5555120825528131 5555120825528131
239393704 10 5555120825528133 5555120825528133

结果似乎没有问题,直到第6行。当旧变量变得太长时,无法再与$ 2进行比较。在第2列中具有较短值的文件末尾,结果再次正确。

任何人都有想法? 我不能使用关联数组,因为文件太大,所以我只能使用if-else条件。

1 个答案:

答案 0 :(得分:6)

强迫"之前" value为字符串而不是数字:

awk '"x" $2 != prev { count++; prev = "x" $2 } {print $1, count, $2}'
237708978 1 5555120825555282
237708978 1 5555120825555282
237708978 2 5555120825555281
237708978 2 5555120825555281
237708978 3 5555120825555283
239480114 4 55551208255552814
239480114 5 55551208255552812
239480114 5 55551208255552812
239480114 6 55551208255552814
239480114 7 55551208255552813
239393704 7 55551208255552813
239393704 8 555512082555528133
239393704 8 555512082555528133
239393704 9 555512082555528132
239393704 9 555512082555528132
239393704 9 555512082555528132
239393704 9 555512082555528132
239393704 10 555512082555528131
239393704 10 555512082555528131
239393704 11 555512082555528133
239393704 12 5555120825528132
239393704 12 5555120825528132
239393704 13 5555120825528133
239393704 14 5555120825528132
239393704 15 5555120825528131
239393704 15 5555120825528131
239393704 16 5555120825528133