bash - 如何选择特定百分比的行?
问题描述
早上好 !
我有一个包含 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% 的已排序行,以确保控制器的百分比很大。
目标是能够根据表中的行数来改变百分比。
你有什么建议吗?
谢谢 !:)
解决方案
我可以发誓这个问题是重复的,但到目前为止我找不到类似的问题。
您的文件是否已排序并不重要。从任何文件中,您都可以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 <()
、 或管道。
推荐阅读
- php - htmlentities
使用 PHPmailer 时忽略 - reactjs - 使用 useEffect 对状态变化做出反应
- json - 如何从 C3.ai COVID-19 数据湖中的 fetch API 将 fetch 返回对象转换为 csv?
- java - 仅通过父属性的 Java 子类等于父类
- haskell - Haskell 类型和值构造函数
- excel - 分配给形状的 Excel 宏可以格式化形状所在的单元格吗?
- laravel - 已解决:Laravel - 无法显示“提交表单”路线
- r - 在 R 中读取文本文件并操作数据
- python - 在 PyQt5 中使用 QStackedWidget
- elasticsearch - org.apache.kafka.connect.errors.ConnectException:错误处理程序中超出容限