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

  • 本文关键字:处理 格式 模式 shell csv awk
  • 更新时间 :
  • 英文 :


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

/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. 在最后一列设置一些筛选器(根据#的编号(,丢弃所有包含######的行。或者,这个过滤器可以应用于倒数第二列,它将#字符的数量表示为一个数字

虽然我可以使用排序完成第一个任务

sort -t '|' -k 3 filename.csv

第二个可以使用AWK 实现

awk '(NR>1) && ($8 > 2) ' filename.csv > filename_processed.txt

考虑到我的文件格式,我如何以高效的方式组合这两个命令?

请您尝试以下内容,在GNUawk中的示例中编写和测试。

awk '
BEGIN{
FS=OFS="|"
}
gsub(/#/,"&",$6)>4
' Input_file | sort -t'|' -nk 3 > output_file


编辑:根据OP的注释,要从Input_file开始获得最后10%的行,您可以执行以下操作,将上述命令的输出转换为输出文件,并可以执行以下命令。

awk -v lines="$(wc -l < output_file)" '
BEGIN{
tenPer=int(lines/10)
}
FNR>(tenPer){exit}
1
' output_file

要获得输出文件最后10%的行,请尝试:

tac output_file | 
awk -v lines="$(wc -l < output_file)" 'BEGIN{tenPer=int(lines/10)} FNR>tenPer{exit} 1' | 
tac

OR

awk -v lines="$(wc -l < output_file)" 'BEGIN{tenPer=int(lines/10)} FNR>=(lines-tenPer)' output_file

您可以尝试:

sort -nr -k 4 scratch.scv | grep -v -E "[^#]#{1,3}$"

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

最好在末尾用更少的行进行排序。

grep -E "#{4}$" file | sort -t"|" -nk3

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

如果你的命令真的是你所需要的,那么

awk '(NR>1) && ($8 > 2) ' filename.csv |
sort -t '|' -k 3 filename.csv > filename_processed.txt

相关内容

  • 没有找到相关文章

最新更新