Linux脚本查找包含特定格式的字符串&操纵数据

时间:2014-06-04 11:32:59

标签: linux bash

我需要创建一个linux脚本来搜索文件中的行格式如下:

文本:文本:文本:文本:号码:号码

所以6个文本/数字字符串除以5分号

例如:

2f0d:011a0000:07f8:0002:1:0

我想将分号视为列分隔符

e.g。

Column1:Column2:Column3:Column4:Column5:Column6

然后我想像这样重新排列数据:

Column1:Column3:Column4:Column2 discarding column5 & column6

例如:

2f0d:07f8:0002:011a0000

然后我想用下划线替换分号,从每列中删除前导零&转换为UPERCASE

例如:

2F0D_7F8_2_11A0000

最终结果

在file1中,这样的条目

2f0d:011a0000:07f8:0002:1:0
E4+1
p:BSkyB,C:0000

将转换为:

2F0D_7F8_2_11A0000                    
E4+1
p:BSkyB,C:0000

另请注意,file1

中的这3个行条目中有100个,如果不是1000个

3 个答案:

答案 0 :(得分:4)

kent$  awk -F: -v OFS="_" 'NF==6{for(i=1;i<=4;i++){sub(/^0*/,"",$i);$i=toupper($i)};print $1,$3,$4,$2;next}7' file  
2F0D_7F8_2_11A0000
E4+1
p:BSkyB,C:0000

你可能想知道,在awk中:

  • sub(pat,rep,input)将替换;
  • toupper(string)会将字符串更改为大写(是的,还有tolower())
  • print $ 1,$ 2将打印col1和col2,由OFS分隔

这个命令比上面的单行更重要:

man gawk

答案 1 :(得分:1)

使用sed的解决方案:

 sed -r 's/^0*([a-f0-9]+):0*([a-f0-9]+):0*([a-f0-9]+):0*([a-f0-9]+):[a-f0-9]+:[a-f0-9]+$/\1_\3_\4_\2/'

请参阅DEMO

答案 2 :(得分:1)

使用sed:

sed -r 's/^0*([[:alnum:]]+):0*([[:alnum:]]+):0*([[:alnum:]]+):0*([[:alnum:]]+):0*([[:digit:]]+):0*([[:digit:]]+)$/\U\1_\3_\4_\2/' foo