首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于数据子集的Linux文件排序

基于数据子集的Linux文件排序
EN

Stack Overflow用户
提问于 2021-01-08 07:27:14
回答 1查看 22关注 0票数 0

OS -红帽企业Linux 8.2 (Ootpa)

下面是我的平面图。

代码语言:javascript
复制
G010XX   OLTP    PDOA210105210304210105000000000000000000000000F                        
G2019998199916        86010027472                       XXXLXXSEXXX860  XXUPMU TEST     
G2019998199916        86010027472                       XXXLXXSEXXX860  XXUPMU TEST     
G2019998199916        86010027472                       XXXLXXSEXXX860  XXUPMU TEST     
G2019998199916        86010027524                       XXXLXXSEXXX860  XXUPMU TEST     
G2019998199916        86010027524                       XXXLXXSEXXX860  XXUPMU TEST     
G2019998199916        86010027524                       XXXLXXSEXXX860  XXUPMU TEST     
G2029998199916        86010027472                       XXXLXXSEXXXXXW-00000000000000000
G2029998199916        86010027472                       XXXLXXSEXXXXXW-00000000000000001
G2029998199916        86010027472                       XXXLXXSEXXXXXW000000000039213488
G2029998199916        86010027524                       XXXLXXSEXXXXXW000000000000000000
G2029998199916        86010027524                       XXXLXXSEXXXXXW000000000000000002
G2029998199916        86010027524                       XXXLXXSEXXXXXW000000000000099357
G2039998199916        86010027472                       XXXLXXSEXXXXXW201210201210095900
G2039998199916        86010027472                       XXXLXXSEXXXXXW201210201210110141
G2039998199916        86010027472                       XXXLXXSEXXXXXW201210201210141946
G2039998199916        86010027524                       XXXLXXSEXXXXXW201210201210163210
G2039998199916        86010027524                       XXXLXXSEXXXXXW201211201211141445
G2039998199916        86010027524                       XXXLXXSEXXXXXW201211201211144629
G2049998199916        86010027472                       XXXLXXSEXXXXXW201210201210095900
G2049998199916        86010027472                       XXXLXXSEXXXXXW201210201210110141
G2049998199916        86010027472                       XXXLXXSEXXXXXW201210201210141946
G2049998199916        86010027524                       XXXLXXSEXXXXXW201210201210163210
G2049998199916        86010027524                       XXXLXXSEXXXXXW201211201211141445
G2049998199916        86010027524                       XXXLXXSEXXXXXW201211201211144629
G020000011140000000000000000000000.000                                                  

  1. 位置1-4是记录类型
  2. 位置23-54是帐户

71-88交易日期详细信息(仅适用于记录类型G203和G204)

我的要求是

根据帐户number

  • Perform排序,
  1. 消除记录G201和G202上的重复,如下所示:1-按帐户号排序-按记录类型排序2-按事务日期排序(仅在G203和G204中可用)

预期产出

代码语言:javascript
复制
G010XX   OLTP    PDOA210105210304210105000000000000000000000000F                        
G2019998199916        86010027472                       XXXLXXSEXXX860  XXUPMU TEST     
G2029998199916        86010027472                       XXXLXXSEXXXXXW-00000000000000000
G2039998199916        86010027472                       XXXLXXSEXXXXXW201210201210095900
G2049998199916        86010027472                       XXXLXXSEXXXXXW201210201210095900
G2039998199916        86010027472                       XXXLXXSEXXXXXW201210201210110141
G2049998199916        86010027472                       XXXLXXSEXXXXXW201210201210110141
G2039998199916        86010027472                       XXXLXXSEXXXXXW201210201210141946
G2049998199916        86010027472                       XXXLXXSEXXXXXW201210201210141946
G2019998199916        86010027524                       XXXLXXSEXXX860  XXUPMU TEST     
G2029998199916        86010027524                       XXXLXXSEXXXXXW000000000000000000
G2039998199916        86010027524                       XXXLXXSEXXXXXW201210201210163210
G2049998199916        86010027524                       XXXLXXSEXXXXXW201210201210163210
G2039998199916        86010027524                       XXXLXXSEXXXXXW201211201211141445
G2049998199916        86010027524                       XXXLXXSEXXXXXW201211201211141445
G2039998199916        86010027524                       XXXLXXSEXXXXXW201211201211144629
G2049998199916        86010027524                       XXXLXXSEXXXXXW201211201211144629
G020000011140000000000000000000000.000                                                  

我试过两种方法。但没有得到想要的输出。oa是我的档案名。

代码语言:javascript
复制
[tmp] $ (
> grep "^G010" oa && \
> ( \
> grep "^G201" oa|sort -u -k 1.1,1.4 -k 1.23,1.56 && \
> grep "^G202" oa|sort -u -k 1.1,1.4 -k 1.23,1.56 && \
> grep -E "^(G203|G204|G205|G206)" oa | sort -k 1.23,1.56 -k 2.71,2.88 -k 3.1,3.4 \
> ) && \
> grep "^G020" oa
> )
G010KR   OLTP    PDOA210105210304210105000000000000000000000000F
G2019998199916        86010027472                       SCBLKRSEXXX860  KRUPMU TEST
G2019998199916        86010027524                       SCBLKRSEXXX860  KRUPMU TEST
G2029998199916        86010027472                       SCBLKRSEXXXKRW-00000000000000000
G2029998199916        86010027524                       SCBLKRSEXXXKRW000000000000000000
G2039998199916        86010027472                       SCBLKRSEXXXKRW201210201210110141
G2049998199916        86010027472                       SCBLKRSEXXXKRW201210201210110141
G2039998199916        86010027472                       SCBLKRSEXXXKRW201210201210141946
G2049998199916        86010027472                       SCBLKRSEXXXKRW201210201210141946
G2039998199916        86010027472                       SCBLKRSEXXXKRW201210201210095900
G2049998199916        86010027472                       SCBLKRSEXXXKRW201210201210095900
G2039998199916        86010027524                       SCBLKRSEXXXKRW201211201211141445
G2049998199916        86010027524                       SCBLKRSEXXXKRW201211201211141445
G2039998199916        86010027524                       SCBLKRSEXXXKRW201210201210163210
G2049998199916        86010027524                       SCBLKRSEXXXKRW201210201210163210
G2039998199916        86010027524                       SCBLKRSEXXXKRW201211201211144629
G2049998199916        86010027524                       SCBLKRSEXXXKRW201211201211144629
G020000011140000000000000000000000.000

[tmp] $ (
> grep "^G010" oa && \
> ( \
> grep "^G201" oa|sort -u -k 1.1,1.4 -k 1.23,1.56 && \
> grep "^G202" oa|sort -u -k 1.1,1.4 -k 1.23,1.56 && \
> grep -E "^(G203|G204|G205|G206)" oa | sort -k 1.23,1.56 -k 2.71,2.88 -k 3.1,3.4 \
> ) | sort -k 1.23,1.56 && \
> grep "^G020" oa
> )
G010KR   OLTP    PDOA210105210304210105000000000000000000000000F
G2019998199916        86010027472                       SCBLKRSEXXX860  KRUPMU TEST
G2029998199916        86010027472                       SCBLKRSEXXXKRW-00000000000000000
G2039998199916        86010027472                       SCBLKRSEXXXKRW201210201210095900
G2039998199916        86010027472                       SCBLKRSEXXXKRW201210201210110141
G2039998199916        86010027472                       SCBLKRSEXXXKRW201210201210141946
G2049998199916        86010027472                       SCBLKRSEXXXKRW201210201210095900
G2049998199916        86010027472                       SCBLKRSEXXXKRW201210201210110141
G2049998199916        86010027472                       SCBLKRSEXXXKRW201210201210141946
G2019998199916        86010027524                       SCBLKRSEXXX860  KRUPMU TEST
G2029998199916        86010027524                       SCBLKRSEXXXKRW000000000000000000
G2039998199916        86010027524                       SCBLKRSEXXXKRW201210201210163210
G2039998199916        86010027524                       SCBLKRSEXXXKRW201211201211141445
G2039998199916        86010027524                       SCBLKRSEXXXKRW201211201211144629
G2049998199916        86010027524                       SCBLKRSEXXXKRW201210201210163210
G2049998199916        86010027524                       SCBLKRSEXXXKRW201211201211141445
G2049998199916        86010027524                       SCBLKRSEXXXKRW201211201211144629
G020000011140000000000000000000000.000
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-08 09:36:55

Awk将是这方面的理想人选(用于数组排序的GNU awk ):

代码语言:javascript
复制
awk 'NR==1 { print;next } $3 == "" { endline=$0;next } { code=substr($1,1,4);map[code][$2][$3]=$0} END {PROCINFO["sorted_in"]="@ind_str_asc";for (i in map) { for (j in map[i]) { for (k in map[i][j]) { print map[i][j][k] } } } print endline }' ootpafile

解释:

代码语言:javascript
复制
awk 'NR==1 { 
             print; # Print the line
             next # Skip to the next line
            } 
   $3 == "" { 
             endline=$0; # Set a variable endline to the current line where the 3rd space delimited field is empty
             next 
            } 
            { 
             code=substr($1,1,4); # Extract the first 4 characters into a variable code
             map[code][$2][$3]=$0 # Store the line in a 3 dimentional array indexed by code and other fields
             } 
         END {
              PROCINFO["sorted_in"]="@ind_str_asc"; # Set the ordering of the array
              for (i in map) { 
                for (j in map[i]) { 
                  for (k in map[i][j]) { 
                     print map[i][j][k] # Loop through the array and print the entries
                  } 
                 } 
               } 
               print endline # Print the end line
              }' ootpa
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65624943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档