awk - 简化这个脚本

Tom*_*Tom 2 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)

gle*_*man 5

awk '
    BEGIN {OFS=FS="\t"} 
    {a[NR]=$2; b[NR]=$3; c[NR]=$4} 
    NR%2 == 0 {
        sub(/-orig$/, "", $1)
        print $1, a[NR]-a[NR-1], b[NR]-b[NR-1], c[NR]-c[NR-1]
    }
' file.txt
Run Code Online (Sandbox Code Playgroud)
  • 使用单独的数组来保存值,因此您不必进行所有拆分
  • 在每个偶数行而不是在 END 块上打印

再看一遍,你甚至不需要数组,只需要记住上一行的值:

awk '
    BEGIN {OFS=FS="\t"} 
    NR%2 == 0 {
        sub(/-orig$/, "", $1)
        print $1, a-$2, b-$3, c-$4
    }
    {a = $2; b = $3; c = $4} 
' file.txt
Run Code Online (Sandbox Code Playgroud)