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

Csv 使用AWK的同一列中的行之间的差异,csv,awk,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 逻辑是这样的: 如果上一个模式不等于此模式,则将此模式和此值记为新的“上一个”,并移到下一行 否则,如果上一个值与此值之间的差值等于1或-1(awk没有abs()函数),则

我想比较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

逻辑是这样的:

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

尝试将其转换为代码,有问题时再回来。

逻辑是这样工作的:

  • 如果上一个模式不等于此模式,则将此模式和此值记为新的“上一个”,并移到下一行
  • 否则,如果上一个值与此值之间的差值等于1或-1(awk没有abs()函数),则打印上一个图案和值并打印此行
尝试将其翻译成代码,有问题时再回来。

给定:

$ 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
$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
中交;9
中交;8.
给定:

$ 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
$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
中交;9
中交;8.

您忘记发布代码了。StackOverflow是关于帮助人们修复代码的。这不是免费的编码服务。有代码总比没有代码好。人们通常使用变量名
prev
,并对当前行(
$0
)进行测试。祝你好运,你忘了发密码了。StackOverflow是关于帮助人们修复代码的。这不是免费的编码服务。有代码总比没有代码好。人们通常使用变量名
prev
,并对当前行(
$0
)进行测试。祝你好运