【问题标题】:Command required to grep only latest unique MSISDN from data仅从数据中 grep 最新的唯一 MSISDN 所需的命令
【发布时间】:2015-07-22 23:18:26
【问题描述】:

我有一个数据,其中有 5 个字段,并且全部用逗号分隔。有两个主要字段 infact 字段 1 是 YYYYMMDD 格式的日期,第二个字段包含 MSISDN 10 位。该文件有大约 1.2 亿个数字,其中一些数字是重复的、一式三份的,但在这种情况下日期不同。

我只需要唯一的 MSISDN,但日期应该是最新的。

【问题讨论】:

  • 请用您目前尝试过的内容更新您的问题(顺便说一下,12 千万是 1.2 亿。这可能对一些读者有所帮助)
  • 一些示例数据行会很有用。我怀疑整个问题都可以通过sortcutuniq 来解决
  • 下面是数据的格式。 20150202,9305027876,3142,180,181 20150202,7408393141,3142,180,230 20150202,7439145410,3147,182,181 20150202,8653681103,3151,182,212 20150202,9279543620,3145,182,213 20150202,8342995876,4191,182,230 20150202,9854057888,3144,182,120 20150201 ,7894447232,3008,212,120 20150202,8014518074,3149,182,110 20150201,8797852093,3285,220,212 我只是尝试下面的命令来获取输出..请评论.. sort -t, -nr -k 1 sohan|sort - u -t, -k 2,2

标签: linux


【解决方案1】:

首先,使用以下命令对文件进行排序:

sort filename.txt > filename.sort

第二次编写程序并逐行解析文件。在每一行找到 msisdn 并将该数字写入映射 map.put(msisdn,lunenumber)。在这一步之后,再次解析文件并打印其行号存在于map中的行。

【讨论】:

    【解决方案2】:

    你熟悉awk吗?也许sortawk 的组合会为您做到这一点。我们假设文件未排序。

    创建一个名为crore.sh 的文件并在其中输入:

    #!/bin/bash
    
    sort --field-separator=',' -rn -k 2,2 \
         -k 1,1 your-filename.txt \
         |
         awk -F',' '
    BEGIN {
        line = 1;
        maxdate = "";
        id = -1;
    }
    {
        if (line == 1) {
            maxdate = $1;
            id = $2;
    
            # to print entire line, use this
            #print $0;
    
            # to print only date and id, use this
            print maxdate,"\t",id;
        }
        else {
            if ($2 != id) {
                maxdate = $1;
                id = $2;
                #print $0;
                print maxdate,"\t",id;
            }
        }
        line++;
    }
    '
    

    不要忘记最后一个单引号。使用包含您的信息的文件更改 your-filename.txt。然后运行,

    $> bash crore.sh
    

    我的文件有以下内容

    20150101,1,test
    20150401,2,test
    20150101,1,test
    20150701,2,test
    20150401,1,test
    
    Result after running the program:
    20150701         2
    20150401         1
    

    使用较小的数据子集运行,以了解运行时以及输出是否正常。

    说明

    • 我们sort第二个字段和第一个字段的数据 - 都是相反的顺序
    • 我们将首先获取每个 ID 的最高日期,然后是该 ID 的任何其他重复记录
    • 使用 awk,我们提取第一条记录以及遇到的具有不同 ID 的每条记录

    希望这些信息对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 2022-11-23
      • 2018-08-17
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      相关资源
      最近更新 更多