获取一个字段的最后n个字符,并在Linux中完成字符串的第二个字段

时间:2016-03-03 06:31:45

标签: linux shell awk cut

我在文件中有两行:

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 

请帮助我达到理想的输出。

4 个答案:

答案 0 :(得分:3)

解决方案2: 以下是能够达到目的的解决方案:

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

8889986665,CRBT123

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

答案 1 :(得分:1)

这是使用awk完成的最佳工作:

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

8889986665,CRBT
2398456781,SEGP30

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

答案 2 :(得分:0)

cat test.txt | cut -f 2,4 -d ","

假设您的文件是test.txt

答案 3 :(得分:0)

sed -r 's/[^,]+,..([^,]+,)([^,]+,)([^,]+),.*/\1\3/' file
8889986665,CRBT123
2398456781,SEGP