处理多行CSV文件,我正在寻找一个可能的Bash工作流,可能对它的处理有用。下面是包含多列格式的数据的文件的格式:
/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 |###按照格式:所有有价值信息的列都由|划分,第一列(行名)除外,其余列由:划分。脚本应该使用以下后处理操作:
#的数量),丢弃了包含#、##或###的所有行。或者,此筛选器可应用于倒数第二列,该列将#字符的数目表示为数字。。
而我可以使用排序完成第一项任务
sort -t '|' -k 3 filename.csv第二种方法可以使用AWK实现。
awk '(NR>1) && ($8 > 2) ' filename.csv > filename_processed.txt如何在考虑到文件的格式的情况下,高效地组合这两个命令?
发布于 2020-10-02 09:51:11
请您试着用GNU awk中显示的示例进行以下、编写和测试。
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用于获得output_file最后一行的10%尝试:
tac output_file |
awk -v lines="$(wc -l < output_file)" 'BEGIN{tenPer=int(lines/10)} FNR>tenPer{exit} 1' |
tac或
awk -v lines="$(wc -l < output_file)" 'BEGIN{tenPer=int(lines/10)} FNR>=(lines-tenPer)' output_file发布于 2020-10-02 10:02:22
你可以试试:
sort -nr -k 4 scratch.scv | grep -v -E "[^#]#{1,3}$"根据列值进行排序,并弹出1-3号#的行。
发布于 2020-10-02 10:08:49
最好在最后用较少的行进行排序。
grep -E "#{4}$" file | sort -t"|" -nk3如果需要筛选不同数量的#,请修改grep表达式中的数字。如果需要反向排序,请将r参数添加到sort命令中。如果需要对不同列进行排序,请修改k参数。
https://stackoverflow.com/questions/64169317
复制相似问题