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