处理多行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 |###
根据格式:所有有价值信息的列都由|
划分,第一列(行名(除外,其余列由:
划分。脚本应进行以下后处理:
- 根据第三列的值对所有行进行降序排序(从负值到正值(
- 在最后一列设置一些筛选器(根据
#
的编号(,丢弃所有包含#
、##
或###
的行。或者,这个过滤器可以应用于倒数第二列,它将#
字符的数量表示为一个数字
虽然我可以使用排序完成第一个任务
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