提前道歉,因为我确信这是一个简单的问题。尽管如此,这里是。
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 来做这件事,因为我有兴趣这样做。
这是文本文件中的一对典型行,它有 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