小编Tom*_*Tom的帖子

带有移动列的累计总数

提前道歉,因为我确信这是一个简单的问题。尽管如此,这里是。

cat blah.txt
aa+2
bb+4
cc+10
dd+31
Run Code Online (Sandbox Code Playgroud)

我想处理 blah.txt 以生成以下内容:

aa+0
bb+2
cc+6
dd+16
Run Code Online (Sandbox Code Playgroud)

这里的概念是第一列可能是歌曲列表,第二列可能是它们的开始时间。

我的预感是使用 awk 来做到这一点。我想到了两个带有数字索引的数组,其中存储了 $1 和 $2 的运行总数。我的想法是将运行总计的数字索引移动 1。

tail -r blah.txt | 
awk -F "+" '{ for(i=0;i<=NR;i++) arr[i+1]+=$2; farr[i]=$1 } END 
{ for(i=NR+1;i>1;i--) {if (i==NR) {print farr[NR] FS 0 } 
else { print farr[i] FS arr[i]}}}'
Run Code Online (Sandbox Code Playgroud)

这并不简洁,更何况是行不通的。我首先对阵列制作的失败感到困惑。

不管怎样,'nuf 说,请好心人帮我摆脱痛苦吗?

汤姆

awk

3
推荐指数
1
解决办法
1700
查看次数

awk - 简化这个脚本

我有一个文本文件。在奇数线上,它为我正在建造的建筑物的关键元素提供了新的维度。

在偶数线上,给出了旧尺寸。

我的目标是处理这个文件并输出每个元素的差异。基本上,这意味着从新值中减去旧值。我想用 awk 来做这件事,因为我有兴趣这样做。

这是文本文件中的一对典型行,它有 4 列:

groundwall-rvsd 0.0     21.8    0.00
groundwall-orig 0.0     20.2    0.00
Run Code Online (Sandbox Code Playgroud)

这是我整理的脚本。它完成了我需要做的工作,但感觉就像一个笨拙的人。

awk 'BEGIN{OFS=FS="\t"}
{if(NR%2==1){foo[NR]=$1 OFS $2 OFS $3 OFS $4}else{bar[NR]=$1 OFS $2 OFS $3 OFS $4}} END 
{for(i=1;i<=NR;i++){if(i%2==1){split(foo[i], foosplit, OFS );split(bar[i+1], barsplit, OFS);split(foosplit[1], elemt, "-"); 
print elemt[1] OFS foosplit[2] - barsplit[2] OFS foosplit[3] - barsplit[3] OFS foosplit[4] - barsplit[4]}}}' file.txt
Run Code Online (Sandbox Code Playgroud)

关于更好的解决方案的任何建议?

输出看起来像这样

groundwall  0   1.6 0
Run Code Online (Sandbox Code Playgroud)

awk

2
推荐指数
1
解决办法
149
查看次数

标签 统计

awk ×2