awk的高级使用

awk的高级使用,awk,Awk,假设您有这样一个文件: Rowname useless number useless number 1596 1787 1595 1787 1594 1787 1565 1803 1565 1804 我知道如何告诉awk跳过无用的数字以及基于行名的awk第5行和第6行。但是,如果与前一行的差异仅为1,我如何告诉awk跳过该行?输出应为: 1596 1787 1565 1803 我的问题是,在某些情况下,我会: 1595 1787 1594 1787

假设您有这样一个文件:

Rowname  
useless number  
useless number  
1596 1787  
1595 1787  
1594 1787  
1565 1803  
1565 1804  
我知道如何告诉awk跳过
无用的数字
以及基于
行名
的awk第5行和第6行。但是,如果与前一行的差异仅为1,我如何告诉awk跳过该行?输出应为:

1596 1787  
1565 1803
我的问题是,在某些情况下,我会:

1595 1787  
1594 1787
换一种方式说:我总是希望从行名称中得到第三行,但如果与第3行的差异仅为1(或2或3),我不希望得到第4行(或5或6)

这有意义吗?

这可能就够了


如果您希望打印“Rowname”,这似乎符合您的要求;如果没有,请省略脚本第一行中的
打印

$     awk '/^Rowname/         { nr=NR; print; next }
>          NR==nr+1||NR==nr+2 { next }
>          NR==nr+3           { v1=$1; print; next }
>                             { if (abs(v1-$1) > 1) print; v1=$1; }
>          function abs(x)    { return (x < 0) ? -x : x }
>         ' data
Rowname
1596 1787
1565 1803
$
$awk'/^Rowname/{nr=nr;print;next}
>NR==NR+1 | | NR==NR+2{next}
>NR==NR+3{v1=$1;打印;下一个}
>{if(abs(v1-$1)>1)打印;v1=$1;}
>函数abs(x){return(x<0)?-x:x}
>"数据,
行名
1596 1787
1565 1803
$

请在问题中包含您现有的代码。祝你好运,嗨!我没有:)我用它来打印我想要的行,但它也包括上面3行。。我必须想办法在事后删除这些。Rowname无用的号码无用的号码1596178715651803您需要准确地显示所示输入的输出,听起来好像问题中没有真正说明其他要求。如果要打印无用的数字,可以添加
print
NR=NR+1 | | NR==NR+2
代码(但如果你想打印它们,它们并不是真正无用的数字)。@user2966591,很有趣。它对我有用。无论如何,我看到乔纳森的解决方案帮了你的忙。祝你一切顺利。
$     awk '/^Rowname/         { nr=NR; print; next }
>          NR==nr+1||NR==nr+2 { next }
>          NR==nr+3           { v1=$1; print; next }
>                             { if (abs(v1-$1) > 1) print; v1=$1; }
>          function abs(x)    { return (x < 0) ? -x : x }
>         ' data
Rowname
1596 1787
1565 1803
$