Awk新手。与负数格式斗争

Awk新手。与负数格式斗争,awk,Awk,目标:仅输出高于1且低于-1的数据 或 输出介于1和-1之间的数据 我有awk的基础知识,可以打印第2列(我的数据在那里) 注意,我还指定了0-1的范围 awk '/[0-1]/ {print $2}' test.dat 我还需要有行号,所以我添加了 awk '/[0-1]/ {print $2 NR}' test.dat 为了确保我清楚,关键是要确定哪些数据行超出了可接受的范围,因此我们可以在分析中忽略它们。(任何大于1或小于-1的变化都太大) 你能提供的任何帮助都会很好。我在下面粘贴

目标:仅输出高于1且低于-1的数据

输出介于1和-1之间的数据

我有awk的基础知识,可以打印第2列(我的数据在那里) 注意,我还指定了0-1的范围

awk '/[0-1]/  {print $2}' test.dat
我还需要有行号,所以我添加了

awk '/[0-1]/  {print $2 NR}' test.dat
为了确保我清楚,关键是要确定哪些数据行超出了可接受的范围,因此我们可以在分析中忽略它们。(任何大于1或小于-1的变化都太大)

你能提供的任何帮助都会很好。我在下面粘贴了一些示例数据


不确定是否要评估每列中的数据,或者是否有特定的列需要测试。测试单个柱是最简单的;测试多个或所有列是模式的一个相当简单的重复扩展。因为您特别提到了第2列,所以假设您只想在第2列介于-1和1之间时打印它:

awk -F, '($2 >= -1) && ($2 <= 1) { print $2 }'

awk-F'[,]''NR>2{for(i=2;我知道shell脚本和awk(语言)在技术上可以算作编程,但我觉得如果在unix.stackexchange.com上而不是在这里问这个问题,这个问题会得到更多的关注。@Wug-True,但这不是bash脚本,这是awk,一种语言。我仍然认为伟大的灰胡子会知道得更好。
awk'/[0-1]/'
不匹配0和1之间的数字。它匹配包含介于“0”和“1”之间(包括“0”和“1”)字符的任何行,即包含“0”或“1”字符的任何行(至少在最常见的语言环境中)。事实上,绝大多数样本编号碰巧有
|x |<1
是巧合。羽翼未丰的颈须。颈须?我从你的回答中学到了一些东西,我试图回答的问题涉及sed和egrep。谢谢你的回答特瓦尔伯格。你能帮我只打印行号吗?我知道你可以使用NR来显示行号。那么,我如何有条件地只打印高于1且低于-1的行号呢?在我的数据集中有6个数据字段,然后一个新行,当我发布时,它不会这样显示……只需将
$2
替换为
NR
。下面是一个示例:
awk-F'($2>=-1)&($2@user1783588如果您只需要在单个字段关闭时打印行号,请参阅Tobi的注释。如果您需要标记具有一个(或多个)关闭字段的任何行,则类似的操作应该有效:
awk-F,'{flag=0;for(i=1;i=-1)&&($i例如:倒数第二行应该输出,但最后一行不应该输出。感谢您的帮助。我已经多年没有编写代码了,所以这确实是一个很大的帮助。嘿,Ed,我运行了它,看起来很棒!我将手动检查和验证。谢谢;DAlmost,我想……我的输出仍然包括前两行。)(这些不是需要的,它们实际上是文字而不是数据):12 66 71 72 88 98 99 100 101 116 124 139 140 141 142 154 155 156 158 173 174 175 176 238 240–2分钟前的用户1783588edit@user1783588用
tail+3文件| awk-F'[,]''{for(i=3;i@user1783588这是一个独立的单行程序,用您的文件名替换
文件
。@TobiLehman:我更新了我的答案,跳过了前两行。不需要尾部和管道。
awk -F, '($2 <= -1) || ($2 >= 1) { print $2 }'
awk -F, '{ for (i = 1; i <= NF; ++i) if (($i >= -1) && ($i <= 1)) print $i; }'
awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i<-1 || $i>1) { print NR; next } }' file