在 AWK 中添加行?
Adding lines in AWK?
你能帮帮我吗?我需要帮助编写 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]=; 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\n" 'NR%2{x=;next} {printf fmt, x,x+,x/(x+); printf fmt,,x+,/(x+)}' 文件
是完美的解决方案!!!!非常感谢!很高兴!但是,当我尝试将命令的输出放入文件时,出现零除错误
root@debian:/home/l0l/Documents/bash# awk -v fmt="%-2i %-2i %.2f\n" 'NR%2{x=;next} {printf fmt, x,x+,x/(x+); printf fmt,,x+,/(x+)}' 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
我们到处都是零除法。关于如何防止这种情况的任何见解?
这是一个简单的单行 awk 示例;
awk 'a[NR]=; 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
希望这对您有所帮助,任务不明确。
尝试:
$ awk -v fmt="%-2i %-2i %.2f\n" 'NR%2{x=;next} {printf fmt, x,x+,x/(x+); printf fmt,,x+,/(x+)}' 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=;next} {d=x+; printf fmt, x,d,(d?x/(x+):0); printf fmt,,d,(d?/(x+):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
对于所需的输出格式
$ awk 'BEGIN {fmt="%d %d %.2g\n"}
NR%2 {v=; next}
{s=v+; printf fmt fmt, v,s,v/s,,s,/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
你能帮帮我吗?我需要帮助编写 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]=; 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\n" 'NR%2{x=;next} {printf fmt, x,x+,x/(x+); printf fmt,,x+,/(x+)}' 文件
是完美的解决方案!!!!非常感谢!很高兴!但是,当我尝试将命令的输出放入文件时,出现零除错误
root@debian:/home/l0l/Documents/bash# awk -v fmt="%-2i %-2i %.2f\n" 'NR%2{x=;next} {printf fmt, x,x+,x/(x+); printf fmt,,x+,/(x+)}' 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
我们到处都是零除法。关于如何防止这种情况的任何见解?
这是一个简单的单行 awk 示例;
awk 'a[NR]=; 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
希望这对您有所帮助,任务不明确。
尝试:
$ awk -v fmt="%-2i %-2i %.2f\n" 'NR%2{x=;next} {printf fmt, x,x+,x/(x+); printf fmt,,x+,/(x+)}' 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=;next} {d=x+; printf fmt, x,d,(d?x/(x+):0); printf fmt,,d,(d?/(x+):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
对于所需的输出格式
$ awk 'BEGIN {fmt="%d %d %.2g\n"}
NR%2 {v=; next}
{s=v+; printf fmt fmt, v,s,v/s,,s,/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