【发布时间】:2012-10-19 08:02:37
【问题描述】:
我有一个像我在这里链接的数据集: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
等等……
同样,我们的想法是我们在该数据集中发现噪声,因此我们需要消除它以使研究有效。感谢您的任何帮助,您可以提供。
编辑:从下面提供的解决方案中,我决定将其分解为我自己的个人学习以及可能阅读此内容的任何其他人:
"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-8 行样本数据,并提供所需的输出。此外,由于 Stackoverflow 旨在帮助程序员,而不是为人们工作,请包括您迄今为止使用的代码、您收到的任何错误消息以及您当前的输出,并标记以指出哪里出了问题。您可以使用输入框顶部的 {} 格式化工具格式化数据和代码,使其可读。选择您的所有数据和代码,然后点击 {} 图标。祝你好运。
-
如果是C shell脚本,需要修改为使用真正的shell而不是贝壳。
-
什么是“awk c shell 脚本”? awk 和 c-shell 是两种不同的脚本语言(后者主要是交互式 shell)。
-
@Keith 我在 c shell 脚本中使用了 awk(即我的文件扩展名为 .tsch)
-
你为什么不给我们看那个脚本?