【问题标题】:Copy lines by rows in awk在awk中逐行复制
【发布时间】:2014-06-27 13:00:03
【问题描述】:

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

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

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 rows two-columns


【解决方案1】:

这在awk 中非常简单。

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

生成第一个文件,然后

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

生成第二个

从您的问题中不清楚您是否知道如何从这些文件中计算平均值和中位数 - 似乎您只是想创建这些输出文件。让我知道其余的是否给您带来了麻烦,或者上述脚本是否不清楚(我认为它们是不言自明的)。

【讨论】:

  • 是的,它对我来说非常好用!非常感谢您的时间和帮助!
【解决方案2】:

如果我理解得很好,您需要平均值和中位数。

平均:

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;来做这件事

我希望这会有所帮助。

【讨论】:

  • 我认为您误解了这个问题。 OP 正在寻找一种将输入文件转换为两个输出文件的方法,其中第一列中的值根据第二列或第三列重复。您可以跳过该步骤来计算加权平均值,但在没有所有值和排序的情况下计算中位数并不容易。而这似乎不是他正在努力解决的问题。
  • 我认为他只需要平均值和中位数,甚至不知道可以这样做。 WRT 中位数,您可以看到我正在对值进行排序。你认为我计算中位数有误吗?
  • 我认为你的回答是对我的补充。您需要在 file.out1file.out2 上执行计算,而不是在 file.in 上。
  • 是的,对 - 谢谢弗洛里斯 - 这对我来说非常好 - 现在我能够计算平均值和中位数。
猜你喜欢
  • 2015-10-30
  • 2014-04-30
  • 1970-01-01
  • 2022-01-19
  • 2013-08-17
  • 2018-03-27
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多