用于从上述字段中减去的 awk 脚本

发布于 2024-10-07 04:03:43 字数 214 浏览 2 评论 0原文

您好,我的输入文件包含一个字段:

30
58
266
274
296
322
331

我需要输出为第二行和第一行(58-30=28)以及第三行和第二行(266-58=208)等的差值。 我的输出应如下所示:

30 30
58 28
266 208
274 8

请问有什么帮助吗?

Hi I have my input file with one field:

30
58
266
274
296
322
331

I need the output to be the difference of 2nd and 1st rows(58-30=28) and 3rd and 2nd rows(266-58=208) and so on.
my output should look like below:

30 30
58 28
266 208
274 8

any help please?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倒数 2024-10-14 04:03:43
data=`cat file | xargs`
echo $data | awk '{a=0; for(i=1; i<=NF;i++) { print $i, $i-a; a=$i}}'

30 30
58 28
266 208
274 8
296 22
322 26
331 9

根据评论更新没有cat/xargs

awk '{printf "%d %d\n", $1, $1-a; a=$1;}' file
data=`cat file | xargs`
echo $data | awk '{a=0; for(i=1; i<=NF;i++) { print $i, $i-a; a=$i}}'

30 30
58 28
266 208
274 8
296 22
322 26
331 9

Update upon comment Without cat/xargs:

awk '{printf "%d %d\n", $1, $1-a; a=$1;}' file
撩人痒 2024-10-14 04:03:43

实际上,您并不需要 Khachick 答案中的 for 循环,因为 Awk 无论如何都会遍历所有行。更简单的是:

cat file | awk '{ BEGIN { a=0 }; { print $1, $1-a; a=$1 }'

但是,也可以通过在 BEGIN 块中初始化变量来跳过您真正不想要的第一行,并且如果在更改其值之前对变量进行了初始化,则不执行打印。有点像:

BEGIN { started=0 }; { if(0 == started) { started = 1 } else { print $1, $1-a } }

You don't actually need the for loop from Khachick's answer as Awk will go through all the rows anyway. Simpler is:

cat file | awk '{ BEGIN { a=0 }; { print $1, $1-a; a=$1 }'

However it is also possible to skip the first row that you don't really want by initialising a variable in the BEGIN block and not doing the print if the variable is so initialised before changing its value. Sort of like:

BEGIN { started=0 }; { if(0 == started) { started = 1 } else { print $1, $1-a } }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文