awk脚本需要修改或可能是grep解决方案(awk的新功能)

时间:2012-10-29 23:40:58

标签: bash awk sh

我有一个像我在这里链接的数据集:http://pastebin.com/7tpBAqua

注意前两行不是数据(数字),尽管如此,第二行与第3行相关联。同样,第4行与第5行相关联,依此类推。

目前,我们有一个awk脚本,可以输出超过阈值的所有行号的信息(任何低于-1且高于1的值),这是输出:

71
72
88
98
99
.... and so on...

如果数字是偶数,我们需要输出奇数后的数字(即72,然后输出72新行然后输出73)

如果数字是奇数,那么我们需要在它之前输出偶数(即如果99然后输出98新行然后输出99)。

70
71
72
73
88
89

等等......

同样,我们的想法是在这个数据集中找到噪声,因此我们需要消除它以使研究有效。感谢您的任何帮助,您可以提供。

编辑:从下面提供的解决方案中,我决定将其分解为我自己的个人学习以及其他可能阅读此内容的人:

"awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i<-1 || $i>1) print (NR%2==0) ? NR ORS NR + 1 : NR - 1 ORS NR; next }' file.txt

首先,我们将制作一个基本算法:

if (cur == even)
  print cur + \n + prev 
else if (cur == odd)
  print prev + \n + cur

-F'[ ,]'   # a flag for field seperator and designating it with [ ,]

'NR>2      # The total Number of input Records seen so far. 

{for (i=2;i<=NF;i++) # for loop starting at 2, ending when greater or equal to NR

if ($i<-1 || $i>1) # when these conditions are met then 

print (NR%2==0)    # print NR modulus 2

? 

NR ORS NR + 1      # current OR next

: NR - 1 ORS NR;   # comparisons?

next }'            # now go to the next NR

file.txt           # save to file.txt

2 个答案:

答案 0 :(得分:3)

以下是使用GNU awk的一种方法,其中一些是以前的代码:

awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i<-1 || $i>1) print (NR%2==0) ? NR ORS NR + 1 : NR - 1 ORS NR; next }' file.txt

答案 1 :(得分:2)

this question获取原始代码,并输入一个测试NR奇偶校验的条件。 (奇偶校验是偶数或奇数的属性,它通过使用模运算符来测试:%)。

awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i>=-1 || $i<=1) { if(NR%2 == 0) { print NR+1 } else { print NR-1} ; next } }'