在awk中按行复制行

在awk中按行复制行,awk,rows,two-columns,Awk,Rows,Two Columns,我有一个输入文件,每行包含一个值和两个权重 我想生成两个输出文件——根据权重,第一列中的值每行重复一次。最好用一个简短的例子来解释这一点。如果输入文件为: file.in: 35 2 0 37 2 3 38 0 4 然后我想生成两个输出文件: file.out1: 35 35 37 37 file.out2: 37 37 37 38 38 38 38 然后,我将使用这些输出文件根据第二列和第三列中的权重计算第一列的平均值和中值 我希望我的问题是清楚的。谢谢您的帮助

我有一个输入文件,每行包含一个值和两个权重

我想生成两个输出文件——根据权重,第一列中的值每行重复一次。最好用一个简短的例子来解释这一点。如果输入文件为:

file.in:

35   2   0
37   2   3
38   0   4
然后我想生成两个输出文件:

file.out1:

35 
35
37
37
file.out2:

37
37
37
38
38
38
38
然后,我将使用这些输出文件根据第二列和第三列中的权重计算第一列的平均值和中值


我希望我的问题是清楚的。谢谢您的帮助。

这在
awk
中非常简单

awk '{for(i=0;i<$2;i++) print $1;}' file.in > file.out1

awk'{for(i=0;i如果我理解得很好,你需要平均值和中位数

平均值:

awk '{a+=$1}END{print a/NR}' file.in
36.6667
中位数:

cat file.in | awk '{print $1}' | sort | awk '{a[NR]=$1}END{ b=NR/2; b=b%1?int(b)+1:b; print a[b] }'
37
说明:

简单地说,NR是一个保持行数的变量,对于平均值,您需要每行的总和除以行数

对于中间值,您希望输入排序并选择中间值,但这对您的输入来说并不简单,因为我将行数3除以2,您将得到1.5,因此您需要一个awk没有的上限函数,因此我使用
b=NR/2;b=b%1?int(b)+1:b;


我希望这能有所帮助。

不幸的是,我认为问题并不清楚。你能编辑你的问题,尝试更好地解释问题吗?你需要基于第一列的平均值和中值,对吗?谢谢你们的评论。我想生成两个输出文件,其中第一列中的值根据e权重。最佳答案给了我Floris-在他的输出后,我能够计算中位数和平均值。是的,太棒了,它对我来说非常好!非常感谢你的时间和帮助!我想你误解了这个问题。OP正在寻找一种方法,将输入文件转换为两个输出文件,其中第一列中的值重复ac根据第二栏或第三栏。你可以跳过这一步来计算加权平均数,但如果没有所有的值和排序,要计算中位数就不那么容易了。这似乎不是他一直在努力解决的问题。我认为他只需要平均数和中位数,甚至不知道这样做是可行的。中位数你可以看到我正在对数值进行排序。你认为我计算中值错误吗?我认为你的答案与我的答案是互补的。你需要在
文件.out1
文件.out2
上进行计算,而不是在
文件.in
上进行计算。是的,对-谢谢你Floris-这对我来说非常好-现在我能够计算平均值和平均值中值的
cat file.in | awk '{print $1}' | sort | awk '{a[NR]=$1}END{ b=NR/2; b=b%1?int(b)+1:b; print a[b] }'
37