2

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

请注意,前两行不是数据(数字),尽管如此,第二行与第三行相关联。同样,第 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

等等……</p>

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

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

"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
4

2 回答 2

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
于 2012-10-30T00:19:19.873 回答
2

从这个问题中获取原始代码,并放入一个测试 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 } }' 
于 2012-10-29T23:55:24.090 回答