【问题标题】:awk script needs revision or possibly grep solution (new to awk)awk 脚本需要修改或可能需要 grep 解决方案(awk 的新手)
【发布时间】: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)
  • 你为什么不给我们看那个脚本?

标签: bash awk sh


【解决方案1】:

这是使用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

【讨论】:

  • 如果重复的行号是个问题(可能不是,但您的问题并不清楚),只需将命令传送到sort -nu。 HTH。
  • 请问ORS是什么?那代表or吗?
  • @user1783588: ORS 是输出记录分隔符的缩写。默认情况下,它是换行符。因此,我可以用"\n" 对其进行硬编码,而不是写ORS。我的解决方案对您有用吗?
【解决方案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 } }' 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多