AWK:如何将第2行划分为第2行,每5行划分第1行值

时间:2015-03-23 10:08:59

标签: awk

我有千行input.txt,每行在“grep”之后包含1个数字。

我希望从每5行划分第2到第4行数,每5行除以第1行,直到文件末尾。

我使用的方式是

paste - - - - - - <input.txt >lines.txt

将5行转换为一行,然后

awk '{print $2/$1,$3/$1,$4/$1,$5/$1}' lines.txt

这有点复杂。有没有更好的方法呢?

感谢。

更新 例如INPUT(一行一个号码) 1 2 4 五 6 7 8 9 10 .....

所需的输出 2 3 4 五 1.1667 1.3333 1.5 1.6667 .....

在grep之前,实际上有更多无用的列/行,我只是扔掉它们。 我是Unix命令的新手。我从这个网站上学到了很多东西。感谢所有想与我们分享经验的人。真的很感激!

3 个答案:

答案 0 :(得分:1)

你可以使用awk完成整个事情:

awk '{if(NR%5==1)a=$1;else $1/=a}1' input.txt

if分支取自第1,6,11行等。它将第一个字段的值保存在变量a中。

else分支在所有其他行上进行,并将字段的值除以a

最后的1{print}的常用简写,表示输入文件中的每一行都会打印出来。

测试出来:

$ seq 10 | awk '{if(NR%5==1)a=$1;else $1/=a}1'
1
2
3
4
5
6
1.16667
1.33333
1.5
1.66667

答案 1 :(得分:1)

我使用

awk '{ n = $1; for(i = 1; i <= 4; ++i) { v = 0; getline v; $i = v / n } } 1' filename

那是:

{
  n = $1                       # 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 = $1; 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

答案 2 :(得分:0)

这就是你想要的。使用seq作为输入

$ seq 10 | awk '
    NR % 5 == 1 {n=$1; next} 
                {printf "%f ", $1/n} 
    NR % 5 == 0 {print ""}
    END         {print ""}
'
2.000000 3.000000 4.000000 5.000000 
1.166667 1.333333 1.500000 1.666667