我想根据列信息对文件进行排序

我想根据列信息对文件进行排序

当我运行输入文件时,我得到一个包含 758 行的文件,如下所示。

DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS11/MoN-MVW.out:::   Total energy:  
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS7/MoN-MVW.out:::    Total energy:  
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS9/MoN-MVW.out:::    Total energy:  
DISTANCIA1.45_SIMETRIA1_GIRO4_ACTIVOS11/MoN-MVW.out:::   Total energy:  

我需要排序,使其看起来像这样。

DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS7/MoN-MVW.out:::   Total energy:  
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS9/MoN-MVW.out:::    Total energy:  
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS11/MoN-MVW.out:::    Total energy:  
DISTANCIA1.45_SIMETRIA1_GIRO4_ACTIVOS11/MoN-MVW.out:::   Total energy: 

换句话说,我需要它按照单词 ACTIVOS 之后的数值进行排序。

答案1

我能够通过以下方式完成此任务:

sed 's/ACTIVOS/\&/g' input | sort -n -t \& -k2 | sed 's/\&/ACTIVOS/g'
  1. 首先我们替换ACTIVOS为单个字符(因为排序只能使用单个字符分隔符)。如果您的文件可能包含该&字符,但如果您知道输入中肯定不会出现另一个字符,则可以替换该字符,这是有风险的。
  2. 现在我们根据第二列对输出进行数字排序(新添加的之后的所有内容&
  3. 现在我们将临时&背部替换为ACTIVOS

使用示例输入:

$ cat input
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS11/MoN-MVW.out:::   Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS7/MoN-MVW.out:::    Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS9/MoN-MVW.out:::    Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO4_ACTIVOS11/MoN-MVW.out:::   Total energy:
$ sed 's/ACTIVOS/\&/g' input | sort -n -t \& -k2 | sed 's/\&/ACTIVOS/g'
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS7/MoN-MVW.out:::    Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS9/MoN-MVW.out:::    Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS11/MoN-MVW.out:::   Total energy:
DISTANCIA1.45_SIMETRIA1_GIRO4_ACTIVOS11/MoN-MVW.out:::   Total energy:

根据您的命令,您应该能够执行以下操作:

grep -R ':: RASSCF root number 1 Total energy:' * | sed 's/ACTIVOS/\&/g' | sort -n -t \& -k2 | sed 's/\&/ACTIVOS/g' > outputCASSCF.txt

答案2

当用你的样本进行测试时,这样的东西就足够好了......

cat textfile | sort -V

如果您正在使用 GNU 扩展运行 sort(或者换句话说,如果您正在使用 GNU/Linux 或具有 GNU 扩展的类 Unix 系统)...

让我知道它是否适用于您的所有文本,如果适用,请不要忘记选择它作为正确答案。

祝你好运!

答案3

另一种处理方法是以某种方式界定字段;下面使用下划线来分隔它们,然后告诉sort从字段 4 中的位置 8 开始对数字进行排序;如果字段 4 中有重复项,则使用字段 3:

sort -t_ -k4.8n -k -k3,3 input

示例输入的输出--debug如下:

DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS7/MoN-MVW.out:::    Total energy:
                                     _
                        _____
________________________________________________________________________
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS9/MoN-MVW.out:::    Total energy:
                                     _
                        _____
________________________________________________________________________
DISTANCIA1.45_SIMETRIA1_GIRO2_ACTIVOS11/MoN-MVW.out:::   Total energy:
                                     __
                        _____
________________________________________________________________________
DISTANCIA1.45_SIMETRIA1_GIRO4_ACTIVOS11/MoN-MVW.out:::   Total energy:
                                     __
                        _____
________________________________________________________________________

相关内容