【问题标题】:Get last n characters of one field and complete second field of a string in Linux在Linux中获取一个字段的最后n个字符并完成字符串的第二个字段
【发布时间】:2016-03-03 06:31:45
【问题描述】:

我在一个文件中有 2 行:

MUMBAI,918889986665,POSTPAID,CRBT123,CRBT,SYSTEM,151004,MONTHLY,160201,160302
MUMBAI,912398456781,POSTPAID,SEGP,SEGP30,SMS,151004,MONTHLY,160201,160302

我想在上面的行中剪切字段 2 和 4。条件是:从字段 2 开始,我只需要十位数字。

期望的输出:

8889986665,CRBT
2398456781,SEGP30

我正在尝试以下命令:

 cut -d',' -f2 test.txt | cut -c3-12 && cut -d',' -f4 test.txt

我的输出:

 8889986665
 2398456781
 CRBT
 SEGP30 

请帮助我实现所需的输出。

【问题讨论】:

    标签: linux shell awk cut


    【解决方案1】:

    解决方案 2: 这是可以达到目的的解决方案:

    cut -d',' -f2,4 1 | sed 's/.*\([0-9]\{10\}\),\(.*\)/\1,\2/'

    8889986665,彩铃123

    2398456781,SEGP

    • cut 会给我们第二个和第四个字段。
    • 在 sed 内部,.* 跳过初始字符,直到遇到前面的第一个模式。
    • 第一个模式是 10 位数字,后跟分号: \([0-9]\{10\}\),
    • 第二种模式是行的其余部分:\(.*\)
    • 现在我们用分号打印两个模式:\1,\2

    请注意,数字10 可以替换为要替换的字符数 在分隔符之前提取 , [0-9] 可以替换为 . if 这些字符可以是任何类型的字符。

    解决方案 1:

    在这种情况下,使用cut 对您来说是最简单的。

    您首先需要从行中过滤出所需的字段 (2,4),然后进行更多过滤(字段 #2 中只有 10 个字符)

    $ cut -d',' -f2,4 test.txt | cut -c3-        
    8889986665,CRBT123
    2398456781,SEGP
    

    【讨论】:

    • 如何知道使用-c3-
    • -c3- 用于列,但我什至不知道它会削减到第 12 位。
    • 没错-c3- 不能假定为第二列的长度可以大于12 或者可以是可变长度。
    • 是的,第一个解决方案假设第二个字段中有 12 个字符。我正在发布其他通用解决方案
    【解决方案2】:

    最好使用awk

    awk -F, -v n=10 '{print substr($2, length($2)-n+1, n) FS $5}' file
    
    8889986665,CRBT
    2398456781,SEGP30
    

    substr 命令将在第二列打印最后一个n 字符。

    【讨论】:

    【解决方案3】:
    sed -r 's/[^,]+,..([^,]+,)([^,]+,)([^,]+),.*/\1\3/' file
    8889986665,CRBT123
    2398456781,SEGP
    

    【讨论】:

      【解决方案4】:
      cat test.txt | cut -f 2,4 -d ","
      

      假设你的文件是 test.txt

      【讨论】:

      • 请在@kometen 的回答下方查看我的评论
      • 这将获取我字段编号 2 和字段编号 4 的全部 12 个数字。我在切割字段之前有一个条件。参考问题的条件。
      猜你喜欢
      • 2013-03-31
      • 2014-08-04
      • 2021-02-11
      • 2018-12-03
      • 2014-08-24
      • 2016-07-05
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多