Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWK:如何将第2到第4行与每5行的第1行值分开_Awk - Fatal编程技术网

AWK:如何将第2到第4行与每5行的第1行值分开

AWK:如何将第2到第4行与每5行的第1行值分开,awk,Awk,我有上千行input.txt,每行在“grep”后面包含一个数字 我想让每5行中的第2到第4行的数字除以每5行中的第1行,直到文件结束 我使用的方式是 paste - - - - - - <input.txt >lines.txt 这有点复杂。有没有更好的办法 谢谢 更新 e、 g.输入(一行一个数字) 1. 2. 4. 5. 6. 7. 8. 9 10 期望输出 2. 3. 4. 5. 1.1667 1.3333 1.5 1.6667 在grep之前,实际上还有更多无用的列/

我有上千行input.txt,每行在“grep”后面包含一个数字

我想让每5行中的第2到第4行的数字除以每5行中的第1行,直到文件结束

我使用的方式是

paste - - - - - - <input.txt >lines.txt
这有点复杂。有没有更好的办法

谢谢

更新 e、 g.输入(一行一个数字) 1. 2. 4. 5. 6. 7. 8. 9 10

期望输出 2. 3. 4. 5. 1.1667 1.3333 1.5 1.6667

在grep之前,实际上还有更多无用的列/行,我只是把它们扔掉。
我不熟悉Unix命令。我从这个网站学到了很多。感谢所有愿意与我们分享经验的好心人。真的很感激

您可以使用awk完成整个工作:

awk '{if(NR%5==1)a=$1;else $1/=a}1' input.txt
如果在第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
我会用

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

awk'{n=$1;for(i=1;i这似乎是您想要的。使用
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 

为什么不只用一个awk脚本就可以完成整个过程呢?你能提出一个问题来显示你的输入样本和所需的输出吗?目前还不清楚你到底想要什么…并在你当前运行的grep命令之前显示输入,因为grep没有用。如果行数太多,这将需要一个结束块来打印不是5的倍数。如果行数可以被5整除,我认为不需要使用
v=0
@JID。否则,不重置它将改变与原始脚本相比的输出。(在
seq 1 12
示例中,最后一行将变为
1.091 1.091 1.091 1 1.091
)哦,是的,我没想到!
{
  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
$ 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