繁体   English   中英

Linux 根据文件名中的不同列排序

[英]Linux Sorting based on different column in file names

您能帮我按几个条件对文件名进行排序吗?

ls -tr | grep ${DATE}* | sort -k1

        dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CDS.sql
        dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CTL.sql
        dboption_02beforetablesize_20200710-092914_A_IS_CRB_CDS.sql
        dboption_02beforetablesize_20200710-092914_A_IS_CRB_CTL.sql
        dboption_03create_table_20200710-092914_A_IS_CRB_CDS.sql
        dboption_03create_table_20200710-092914_A_IS_CRB_CTL.sql
        dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CDS.sh
        dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CTL.sh
        dboption_05drop_table_20200710-092914_A_IS_CRB_CDS.sql
        dboption_05drop_table_20200710-092914_A_IS_CRB_CTL.sql
        dboption_06aftertablesize_20200710-092914_A_IS_CRB_CDS.sql
        dboption_06aftertablesize_20200710-092914_A_IS_CRB_CTL.sql
        dboption_07afterschemasize_20200710-092914_A_IS_CRB_CDS.sql
        dboption_07afterschemasize_20200710-092914_A_IS_CRB_CTL.sql

我想要的 output 应该是:数据库,架构,然后是文件号

A_IS_CRB 是数据库,CTL、CDS 是模式。 (它也可以有不同的数据库名称)

我想为一个数据库处理一个架构的所有 7 个文件,然后继续处理同一数据库不同架构的其他 7 个文件或具有某些架构的不同数据库。

我尝试了几件事:

    ls -tr | grep ${DATE}* | sort -k1
    ls -tr | grep ${DATE}* | sort -t $'_'  -k4 -k5 -k2,2
    ls -tr | grep ${DATE}* | grep "  awk -F'[0-9]_' '{print $NF}' |awk -F_ '{print $NF}' |sed 's/.sql//' |sed 's/.sh//' | sed 's/\_$//'| uniq"  (to grep schema)
    

没有运气,非常感谢任何帮助。 所需的 output 是:

 dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CDS.sql
    dboption_02beforetablesize_20200710-092914_A_IS_CRB_CDS.sql
    dboption_03create_table_20200710-092914_A_IS_CRB_CDS.sql
    dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CDS.sh
    dboption_05drop_table_20200710-092914_A_IS_CRB_CDS.sql
    dboption_06aftertablesize_20200710-092914_A_IS_CRB_CDS.sql
    dboption_07afterschemasize_20200710-092914_A_IS_CRB_CDS.sql
    dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CTL.sql
    dboption_02beforetablesize_20200710-092914_A_IS_CRB_CTL.sql
    dboption_03create_table_20200710-092914_A_IS_CRB_CTL.sql
    dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CTL.sh
    dboption_05drop_table_20200710-092914_A_IS_CRB_CTL.sql
    dboption_06aftertablesize_20200710-092914_A_IS_CRB_CTL.sql
    dboption_07afterschemasize_20200710-092914_A_IS_CRB_CTL.sql

我将文件名隔离在两个表中,然后在处理结束时显示它们

awk '$0 ~ /_CDS/{cds[$0]} $0 ~ /_CTL/{ ctl[$0]} END{for(i in cds){print i} for(ii in ctl){print ii}}'  your_file

告诉我这个解决方案是否适合你。

如果我明白你想要什么,你想按 db-schema 排序,这样你就可以使用CDS模式处理 1-7 个文件,然后使用CTL模式处理 1-7 个文件。 您可以使用awk拆分来隔离 db-schema,输出整个记录,然后输出 db-schema 以允许排序,然后再次使用awk删除第二个 db-schema 排序列,例如

awk -F'-' '{split($2,a,"_"); print $0" "substr(a[5],1,3)}' listing | 
sort -k2 | 
awk '{print $1}'

示例 Output

通过您在listing文件中的输入,您将收到:

dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CDS.sql
dboption_02beforetablesize_20200710-092914_A_IS_CRB_CDS.sql
dboption_03create_table_20200710-092914_A_IS_CRB_CDS.sql
dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CDS.sh
dboption_05drop_table_20200710-092914_A_IS_CRB_CDS.sql
dboption_06aftertablesize_20200710-092914_A_IS_CRB_CDS.sql
dboption_07afterschemasize_20200710-092914_A_IS_CRB_CDS.sql
dboption_01beforeschemasize_20200710-092914_A_IS_CRB_CTL.sql
dboption_02beforetablesize_20200710-092914_A_IS_CRB_CTL.sql
dboption_03create_table_20200710-092914_A_IS_CRB_CTL.sql
dboption_04Export_DDL_AFTER_CHANGE_20200710-092914_A_IS_CRB_CTL.sh
dboption_05drop_table_20200710-092914_A_IS_CRB_CTL.sql
dboption_06aftertablesize_20200710-092914_A_IS_CRB_CTL.sql
dboption_07afterschemasize_20200710-092914_A_IS_CRB_CTL.sql

如果您需要更改此 output,请告诉我。


编辑 - 使用“-”更新每格式更改分隔数据库名称和架构

在评论中,当您建议 db-name 和 db-schema 未修复,其中 db-name 具有两个'_'分隔符并且在 db-schema 中没有,这产生了一个问题,即什么构成了 db-name 以及什么db-schema 现在是否模棱两可。 无法知道您是否具有 3 部分(两个'_' )名称和 2 部分(一个'_' )架构或 4 部分名称(三个'_' )和 1 部分架构( no '_' )(或 3-5 部分名称和 1-3 部分模式之间的任何其他 6 或 7 个组合)。

添加'-'作为 db-name 和 db-schema 之间的分隔符现在提供了一种明确的方式来将 db-schema 与文件名隔离开来,而不管 db-name 中由'_'分隔的部分的数量和数据库模式。 您可以使用'-'作为awk的分隔符,然后$NF成为最后一个字段。 (数据库模式加扩展)。 然后使用substr($NF, 1, match($1, /[.]/) - 1)您可以单独隔离 db-schema。

awk -F'-' '{ print $0" "substr($NF,1,match($NF,/[.]/)-1) }' listing | 
sort -k2 | 
awk '{print $1}'

简短示例输入

$ cat listing
dboption_01beforeschemasize_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_01beforeschemasize_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
dboption_02beforetablesize_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_02beforetablesize_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
dboption_03create_table_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_03create_table_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql

示例使用/输出

$ awk -F'-' '{ print $0" "substr($NF,1,match($NF,/[.]/)-1) }' listing |
> sort -k2 |
> awk '{print $1}'
dboption_01beforeschemasize_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_02beforetablesize_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_03create_table_20200710-092914_A_FOO_IS_CRB-PDO_CDS.sql
dboption_01beforeschemasize_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
dboption_02beforetablesize_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql
dboption_03create_table_20200710-092914_A_FOO_IS_CRB-PDO_CTS.sql

如果您想将扩展作为 db-schema 的一部分进行维护(我看到您同时拥有.sql.sh扩展),那么只需使用以下命令作为第一个awk命令

awk -F'-' '{ print $0" "$NF }` listing

给它一个 go 和你的更新名称,如果有任何问题,请告诉我。


附加排序按 DBSchema,然后是 DBName,然后是 FileNo。

为了按您列出的所有其他参数进行排序,您需要将主字段分隔符更改为允许分隔每个字段并从字段中提取排序所需的信息。 一个不错的选择就是使用'-'将字段分隔为:

Option  fileno_stuff  date  time  dbname  dbschema

这将对应于示例记录,例如:

dboption-03create_table-20200710-092914-FOO_PDA-BAR_CDS.sql

如果您对列表进行了这些更改,那么您可以在列表中添加三列(例如filenodbnamedbschema ),然后您可以sort -k4 -k3 -k2n 对于 append 字段并对新数据进行排序,您可以执行以下操作:

awk -F'-' '{print $0" "substr($2,1,match($2,/[^0-9]+/)-1)+0" "$(NF-1)" "substr($NF,1,match($NF,/[.]/)-1)}' listing | 
sort -k4 -k3 -k2n | 
awk '{print $1}'

示例输入列表

dboption-01beforeschemasize-20200710-092914_A_IS_CRB-CDS.sql
dboption-01beforeschemasize-20200710-092914_A_IS_CRB-CDT.sql
dboption-01beforeschemasize-20200710-092914_PDA-CDS.sql
dboption-02beforetablesize-20200710-092914_A_IS_CRB-CDS.sql
dboption-02beforetablesize-20200710-092914_A_IS_CRB-CDT.sql
dboption-02beforetablesize-20200710-092914_PDA-CDS.sql
dboption-03create_table-20200710-092914_A_IS_CRB-CDS.sql
dboption-03create_table-20200710-092914_A_IS_CRB-CDT.sql
dboption-03create_table-20200710-092914_PDA-CDS.sql

排序 Output

dboption-01beforeschemasize-20200710-092914_A_IS_CRB-CDS.sql
dboption-02beforetablesize-20200710-092914_A_IS_CRB-CDS.sql
dboption-03create_table-20200710-092914_A_IS_CRB-CDS.sql
dboption-01beforeschemasize-20200710-092914_PDA-CDS.sql
dboption-02beforetablesize-20200710-092914_PDA-CDS.sql
dboption-03create_table-20200710-092914_PDA-CDS.sql
dboption-01beforeschemasize-20200710-092914_A_IS_CRB-CDT.sql
dboption-02beforetablesize-20200710-092914_A_IS_CRB-CDT.sql
dboption-03create_table-20200710-092914_A_IS_CRB-CDT.sql

当您有重新格式化的列表时,请尝试一下,让我知道任何问题。

看这个:

 sort -t '-' -k2  list

这可能是您的最佳解决方案。 如果这是你想要的,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM