首页 > 解决方案 > 如何选择特定百分比的行?

问题描述

早上好 !

我有一个包含 140 行和 26 列的 file.csv。我需要根据第 23 列中的值对行进行排序。这是一个示例:

Controller1,NA,ASHEBORO,ASH,B,,3674,4572,1814,3674,4572,1814,1859,#NAME?,0,124.45%,49.39%,19%,1,,"Big Risk, No Spare disk",45.04%,4.35%,12.63%,160,464,,,,,,0,1,1,1,0,410,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller2,EU,FR,URG,D,,0,0,0,0,0,0,0,#NAME?,0,#DIV/0!,#DIV/0!,#DIV/0!,1,,#N/A,0.00%,0.00%,#DIV/0!,NO STATS,-1088,,,,,,#N/A,#N/A,#N/A,#N/A,0,#N/A,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller3,EU,FR,URG,D,,0,0,0,0,0,0,0,#NAME?,0,#DIV/0!,#DIV/0!,#DIV/0!,1,,#N/A,0.00%,0.00%,#DIV/0!,NO STATS,-2159,,,,,,#N/A,#N/A,#N/A,#N/A,0,#N/A,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller4,NA,STARR,STA,D,,4430,6440,3736,4430,6440,3736,693,#NAME?,0,145.38%,84.35%,18%,1,,No more Data disk,65.17%,19.18%,-2.18%,849,-96,,,,,,0,2,1,2,2,547,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,

要根据第 23 列的值对行进行排序,我这样做:

awk -F "%*," '$23 > 4' myfikle.csv

结果 :

Controller1,NA,ASHEBORO,ASH,B,,3674,4572,1814,3674,4572,1814,1859,#NAME?,0,124.45%,49.39%,19%,1,,"Big Risk, No Spare disk",45.04%,4.35%,12.63%,160,464,,,,,,0,1,1,1,0,410,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller4,NA,STARR,STA,D,,4430,6440,3736,4430,6440,3736,693,#NAME?,0,145.38%,84.35%,18%,1,,No more Data disk,65.17%,19.18%,-2.18%,849,-96,,,,,,0,2,1,2,2,547,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,

在我的示例中,我在第 23 列中使用 4% 的值,目标是检索所有行,其值以 % 为单位,这在第 23 列中显着增加。问题是我不能基于 4% 值因为它只代表当前表。所以我必须找到另一种方法来检索第 23 列中具有高值的行。

我必须根据第 23 列中的百分比对控制器进行降序排序,我更喜欢处理前 10% 的已排序行,以确保控制器的百分比很大。

目标是能够根据表中的行数来改变百分比。

你有什么建议吗?

谢谢 !:)

标签: bashawk

解决方案


我可以发誓这个问题是重复的,但到目前为止我找不到类似的问题。

您的文件是否已排序并不重要。从任何文件中,您都可以NUMBER使用head -n NUMBER. 没有内置的方法来指定百分比数字,但您可以计算出PERCENT文件行的百分比是NUMBER行。

percentualHead() {
  percent="$1"
  file="$2"
  linesTotal="$(wc -l < "$file")"
  (( lines = linesTotal * percent / 100  ))
  head -n "$lines" "$file"
}

或更短但可读性较差

percentualHead() {
  head -n "$(( "$(wc -l < "$2")" * "$1" / 100  ))" "$2"
}

调用percentualHead 10 yourFile会将前 10% 的行打印yourFile到标准输出。

请注意,这percentualHead仅适用于文件,因为文件必须被读取两次。它不适用于 FIFO <()、 或管道。


推荐阅读