首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shell:根据其列模式处理多行格式。

shell:根据其列模式处理多行格式。
EN

Stack Overflow用户
提问于 2020-10-02 09:34:03
回答 4查看 99关注 0票数 2

处理多行CSV文件,我正在寻找一个可能的Bash工作流,可能对它的处理有用。下面是包含多列格式的数据的文件的格式:

代码语言:javascript
复制
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_1000.dlg:   6 |     -4.86 |   2 |     -4.79 |   4 |####
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_1001.dlg:   2 |     -5.25 |  10 |     -5.22 |   8 |########
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_1002.dlg:   5 |     -5.76 |   6 |     -5.48 |   3 |###
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_1003.dlg:   4 |     -3.88 |  17 |     -3.50 |   3 |###
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_1009.dlg:   5 |     -4.51 |   5 |     -4.39 |   4 |####
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_100.dlg:   3 |     -4.40 |  11 |     -4.38 |   9 |#########
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_1010.dlg:   1 |     -5.07 |  15 |     -4.51 |   5 |#####
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_150.dlg:   4 |     -5.01 |   5 |     -4.82 |   3 |###
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_156.dlg:   2 |     -5.38 |  11 |     -4.70 |   3 |###
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_157.dlg:   1 |     -4.22 |  10 |     -4.16 |   7 |#######
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_167.dlg:   2 |     -3.85 |   3 |     -3.69 |   9 |#########
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_168.dlg:   2 |     -4.42 |  12 |     -4.01 |   6 |######
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_169.dlg:   2 |     -4.94 |  17 |     -4.80 |   5 |#####
/scratch_p/johnycash/results_test_docking/7000/7000_01_lig_cne_16.dlg:   1 |     -6.23 |   4 |     -5.77 |   4 |###

按照格式:所有有价值信息的列都由|划分,第一列(行名)除外,其余列由:划分。脚本应该使用以下后处理操作:

  1. 根据第三列的值对所有行进行降序(从大部分为负值到正值);
  2. 为最后一列设置了一些筛选器(根据#的数量),丢弃了包含######的所有行。或者,此筛选器可应用于倒数第二列,该列将#字符的数目表示为数字。

而我可以使用排序完成第一项任务

代码语言:javascript
复制
sort -t '|' -k 3 filename.csv

第二种方法可以使用AWK实现。

代码语言:javascript
复制
awk '(NR>1) && ($8 > 2) ' filename.csv > filename_processed.txt

如何在考虑到文件的格式的情况下,高效地组合这两个命令?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-10-02 09:51:11

请您试着用GNU awk中显示的示例进行以下、编写和测试。

代码语言:javascript
复制
awk '
BEGIN{
  FS=OFS="|"
}
gsub(/#/,"&",$6)>4
' Input_file | sort -t'|' -nk 3 > output_file

编辑:按照OP的注释获得从您可以遵循的Input_file开始的最后10%行的,将上面命令的输出输入到一个输出文件中,然后运行以下命令。

代码语言:javascript
复制
awk -v lines="$(wc -l < output_file)" '
BEGIN{
  tenPer=int(lines/10)
}
FNR>(tenPer){exit}
1
' output_file

用于获得output_file最后一行的10%尝试:

代码语言:javascript
复制
tac output_file | 
awk -v lines="$(wc -l < output_file)" 'BEGIN{tenPer=int(lines/10)} FNR>tenPer{exit} 1' | 
tac

代码语言:javascript
复制
awk -v lines="$(wc -l < output_file)" 'BEGIN{tenPer=int(lines/10)} FNR>=(lines-tenPer)' output_file
票数 3
EN

Stack Overflow用户

发布于 2020-10-02 10:02:22

你可以试试:

代码语言:javascript
复制
sort -nr -k 4 scratch.scv | grep -v -E "[^#]#{1,3}$"

根据列值进行排序,并弹出1-3号#的行。

票数 3
EN

Stack Overflow用户

发布于 2020-10-02 10:08:49

最好在最后用较少的行进行排序。

代码语言:javascript
复制
grep -E "#{4}$" file | sort -t"|" -nk3

如果需要筛选不同数量的#,请修改grep表达式中的数字。如果需要反向排序,请将r参数添加到sort命令中。如果需要对不同列进行排序,请修改k参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64169317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档