AWK:如何将第 2 行到第 4 行与每 5 行的第 1 行值分开
AWK: how to divide 2nd to 4th row with 1st row value for every 5 rows
我有一千行 input.txt ,每行在 "grep".
之后包含 1 个数字
我想要将每 5 行中的第 2 到第 4 行号除以每 5 行中的第 1 行,直到文件末尾。
我使用的方式是
paste - - - - - - <input.txt >lines.txt
将5行转换为一行,然后
awk '{print /,/,/,/}' lines.txt
这有点复杂。有没有更好的方法来做到这一点?
谢谢。
已更新
例如输入(一行一个数字)
1个
2个
4个
5个
6个
7
8个
9
10
.....
期望的输出
2个
3个
4个
5个
1.1667
1.3333
1.5
1.6667
.....
grep之前,其实还有更多没用的columns/rows,我直接扔掉了。
我是 Unix 命令的新手。我从这个网站学到了很多东西。感谢所有愿意与我们分享经验的好心人。非常感谢!
您可以使用 awk 完成所有事情:
awk '{if(NR%5==1)a=;else /=a}1' input.txt
if
分支取自第 1、6、11 行等。它将第一个字段的值保存在变量a
.
中
else
分支在所有其他行上采用,并将字段的值除以 a
。
末尾的1
是{print}
的常用shorthand,意思是输入文件中的每一行都被打印出来。
正在测试:
$ seq 10 | awk '{if(NR%5==1)a=;else /=a}1'
1
2
3
4
5
6
1.16667
1.33333
1.5
1.66667
我会用
awk '{ n = ; for(i = 1; i <= 4; ++i) { v = 0; getline v; $i = v / n } } 1' filename
即:
{
n = # remember divisor
for(i = 1; i <= 4; ++i) { # four times:
v = 0 # Reset base value (to achieve the same output
# as the original approach in case the number
# of input lines is not cleanly divisible by 5)
getline v # fetch a new line into variable v (if there
# are no more lines, v is unchanged)
$i = v / n # set the ith field in the output to that line
# divided by the divisor
}
}
1 # then print
示例输出:
$ seq 1 12 | awk '{ n = ; for(i = 1; i <= 4; ++i) { v = 0; getline v; $i = v / n } } 1'
2 3 4 5
1.16667 1.33333 1.5 1.66667
1.09091 0 0 0
这似乎是您想要的。使用 seq
作为输入
$ seq 10 | awk '
NR % 5 == 1 {n=; next}
{printf "%f ", /n}
NR % 5 == 0 {print ""}
END {print ""}
'
2.000000 3.000000 4.000000 5.000000
1.166667 1.333333 1.500000 1.666667
我有一千行 input.txt ,每行在 "grep".
之后包含 1 个数字我想要将每 5 行中的第 2 到第 4 行号除以每 5 行中的第 1 行,直到文件末尾。
我使用的方式是
paste - - - - - - <input.txt >lines.txt
将5行转换为一行,然后
awk '{print /,/,/,/}' lines.txt
这有点复杂。有没有更好的方法来做到这一点?
谢谢。
已更新 例如输入(一行一个数字) 1个 2个 4个 5个 6个 7 8个 9 10 .....
期望的输出 2个 3个 4个 5个 1.1667 1.3333 1.5 1.6667 .....
grep之前,其实还有更多没用的columns/rows,我直接扔掉了。 我是 Unix 命令的新手。我从这个网站学到了很多东西。感谢所有愿意与我们分享经验的好心人。非常感谢!
您可以使用 awk 完成所有事情:
awk '{if(NR%5==1)a=;else /=a}1' input.txt
if
分支取自第 1、6、11 行等。它将第一个字段的值保存在变量a
.
else
分支在所有其他行上采用,并将字段的值除以 a
。
末尾的1
是{print}
的常用shorthand,意思是输入文件中的每一行都被打印出来。
正在测试:
$ seq 10 | awk '{if(NR%5==1)a=;else /=a}1'
1
2
3
4
5
6
1.16667
1.33333
1.5
1.66667
我会用
awk '{ n = ; for(i = 1; i <= 4; ++i) { v = 0; getline v; $i = v / n } } 1' filename
即:
{
n = # remember divisor
for(i = 1; i <= 4; ++i) { # four times:
v = 0 # Reset base value (to achieve the same output
# as the original approach in case the number
# of input lines is not cleanly divisible by 5)
getline v # fetch a new line into variable v (if there
# are no more lines, v is unchanged)
$i = v / n # set the ith field in the output to that line
# divided by the divisor
}
}
1 # then print
示例输出:
$ seq 1 12 | awk '{ n = ; for(i = 1; i <= 4; ++i) { v = 0; getline v; $i = v / n } } 1'
2 3 4 5
1.16667 1.33333 1.5 1.66667
1.09091 0 0 0
这似乎是您想要的。使用 seq
作为输入
$ seq 10 | awk '
NR % 5 == 1 {n=; next}
{printf "%f ", /n}
NR % 5 == 0 {print ""}
END {print ""}
'
2.000000 3.000000 4.000000 5.000000
1.166667 1.333333 1.500000 1.666667