AWK:如何将第2到第4行与每5行的第1行值分开
我有上千行input.txt,每行在“grep”后面包含一个数字 我想让每5行中的第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之前,实际上还有更多无用的列/
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