我有一个文本文件。在奇数线上,它为我正在建造的建筑物的关键元素提供了新的维度。
在偶数线上,给出了旧尺寸。
我的目标是处理这个文件并输出每个元素的差异。基本上,这意味着从新值中减去旧值。我想用 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 '
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)
再看一遍,你甚至不需要数组,只需要记住上一行的值:
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)
归档时间: |
|
查看次数: |
149 次 |
最近记录: |