使用AWK在同一列中的行之间的差异

时间:2016-01-21 16:48:16

标签: csv awk

我想比较csv文件中同一列的行,并仅保留符合以下条件的行

1.如果第一个模式与上一行中的模式相同,则

2.第二列中的值之差等于abs(1)

例如,如果我有这行

aaaa;12
aaaa;13
bbbb;11
bbbb;9
cccc;9
cccc;8

我只会保留

aaaa;12
aaaa;13
cccc;9
cccc;8

2 个答案:

答案 0 :(得分:2)

逻辑将以这种方式工作:

  • 如果前一个模式不等于此模式,则记住此模式并将此值作为新的“上一个”,然后移至下一行。
  • 否则,如果前一个值与此值之间的差值等于1或-1(awk没有abs()函数),则打印上一个模式和值并打印此行。

尝试将其翻译成代码,然后在有疑问时回来。

答案 1 :(得分:1)

假设:

$ echo "$test" 
aaaa;12
aaaa;13
bbbb;11
bbbb;9
cccc;9
cccc;8

您可以执行以下操作:

$ echo "$test" | awk -F ";" 'function abs(v) {return v < 0 ? -v : v} $1==l1 && abs($2-l2)==1 {print l1 FS l2 RS $0} {l1=$1;l2=$2}'
aaaa;12
aaaa;13
cccc;9
cccc;8