在 AWK 中添加行?

问题描述 投票:0回答:4

你能帮我吗?我需要帮助编写 AWK,但我无法完成此任务。也可以是 BASH 解决方案。 代码:

1
4
7
5
5
1
4
8
3
6

我想要的输出是 代码:

1 5 .2
4 5 .8
7 12 .58
5 12 .41
5 6  .83
1 6  .16
4 12 .33
8 12 .66
3 9 .5
6 9  .5

如您所见,我需要将偶数行和奇数行添加在一起以生成第二列。该值保留在 2 行中,因为我需要进行一些搜索并将结果相加以获得百分比。

之后,我需要将第一列中的值除以第二列中相同位置的值。以获得百分比。

我就是无法有效地完成它。我现在正在做的只是将奇数行与偶数行放在一个单独的文件中,然后附加列并继续为两个文件创建一个数组,然后进行代数。一定是使用 AWK 的简单方法,不涉及临时文件或类似的东西。

在以下文本文件上使用 dudiboy 建议的代码片段时,这些是我得到的不正确结果:

这是list.txt文件内容:

1
2
6
6
8
1
2
3
5


root@debian:/home/l0l/Documents/awk# awk 'a[NR]=$1; END {for (ln=2; ln<=NR; ln+=2){ print(a[ln], a[ln]+a[ln-1], a[ln]/a[ln-1]); print(a[ln], a[ln]+a[ln-1], a[ln-1]/a[ln]);}}' list.txt
1
2
6
6
8
1
2
3
5
2 3 2
2 3 0.5
6 12 1
6 12 1
1 9 0.125
1 9 8
3 5 1.5
3 5 0.666667 

百分比的偏差很大,打印出来的方式也很偏差,我会继续尝试,但我真的很感激任何帮助。请逐步指导我有关建议的命令?

更新: $ awk -v fmt="%-2i %-2i %.2f " 'NR%2{x=$1;next} {printf fmt, x,x+$1,x/(x+$1); printf fmt,$1,x+$1,$1/(x+$1)}' 文件

这是完美的解决方案!!!非常感谢!!太高兴了!但是,当我尝试将命令的输出放入文件中时,我收到零除错误

root@debian:/home/l0l/Documents/bash# awk -v fmt="%-2i %-2i %.2f\n" 'NR%2{x=$1;next} {printf fmt, x,x+$1,x/(x+$1); printf fmt,$1,x+$1,$1/(x+$1)}'     results >> RESULTS2.txt
awk: cmd. line:1: (FILENAME=results FNR=648) fatal: division by zero attempted

我在 2000 个零件的数字列表上使用它,有时会出现连续 2 个零。所以它产生的第二列也有一个 0,然后由于我们除以零,我们得到了这个零除问题。我们如何防止这种情况发生?我必须在文件中保留 0,这非常重要。也许有不同的方法来计算百分比? 如何在没有零除法的情况下获得良好的输出? 例如,如果列表文件现在是:

0
0
1
5
5
6 
0
0
0
1
0
0

我们的分歧为零。关于如何防止这种情况的任何见解?

gnu gawk
4个回答
1
投票

尝试:

$ awk -v fmt="%-2i %-2i %.2f\n" 'NR%2{x=$1;next} {printf fmt, x,x+$1,x/(x+$1); printf fmt,$1,x+$1,$1/(x+$1)}' file
1  5  0.20
4  5  0.80
7  12 0.58
5  12 0.42
5  6  0.83
1  6  0.17
4  12 0.33
8  12 0.67
3  9  0.33
6  9  0.67

更新了问题,避免除以零

$ awk -v fmt="%-2i %-2i %.2f\n" 'NR%2{x=$1;next} {d=x+$1; printf fmt, x,d,(d?x/(x+$1):0); printf fmt,$1,d,(d?$1/(x+$1):0)}' file2
0  0  0.00
0  0  0.00
1  6  0.17
5  6  0.83
5  11 0.45
6  11 0.55
0  0  0.00
0  0  0.00
0  1  0.00
1  1  1.00
0  0  0.00
0  0  0.00

0
投票

这是一个简单的 oneline awk 示例;

awk 'a[NR]=$1; END {for (ln=2; ln<=NR; ln+=2){ print(a[ln], a[ln]+a[ln-1], a[ln]/a[ln-1]); print(a[ln], a[ln]+a[ln-1], a[ln-1]/a[ln]);}}' list.1.txt

希望这有帮助,任务不清楚。


0
投票

所需的输出格式

$ awk 'BEGIN {fmt="%d %d %.2g\n"} 
       NR%2  {v=$1; next} 
             {s=v+$1; printf fmt fmt, v,s,v/s,$1,s,$1/s}' file

1 5 0.2
4 5 0.8
7 12 0.58
5 12 0.42
5 6 0.83
1 6 0.17
4 12 0.33
8 12 0.67
3 9 0.33
6 9 0.67

0
投票

无数组

awk
解决方案可以安全地处理除以零,同时避免使用模运算(
%
)来检查奇数行与偶数行。

echo '
1
4
7
5
5
1
4
8
3
6' | 

awk 'BEGIN { _____ = (_ = "%-2i %-2i %.2f")RS _ } (__ = !__) ? (_ = +$__)<_ : $NF = \
     sprintf(_____, ____ = _, _ += ___ = +$__, _ ? ____/_ : _, ___, _, _ ? ___/_ : _)'

1  5  0.20
4  5  0.80
7  12 0.58
5  12 0.42
5  6  0.83
1  6  0.17
4  12 0.33
8  12 0.67
3  9  0.33
6  9  0.67
© www.soinside.com 2019 - 2024. All rights reserved.