Chinaunix

标题: 如何处理该文件 [打印本页]

作者: Ladore    时间: 2015-08-12 11:31
标题: 如何处理该文件
本帖最后由 Ladore 于 2015-08-12 14:29 编辑

现有文件a.txt如下

  1.   A           B            C                        D             E                    F           G
  2. 03085810    00015802  9200000000111223445          5.00 14 失败1,ABC [L105303][3.20] IDEABCDEC    111111
  3. 03085810    00015802  6666 1111 2222 3333          7.50 14 AS 失败2 [L107859][3.20]  IDEABCDEC    222222
  4. 03085810    00015802  6666 1111 2222 3333          2.00 11 失败3 [L109317][01]       IDEABCDEC    333333
  5. 03085810    00015802  6666 1111 2222 3333        398.00 失败4 [11] [                 IDEABCDEC    444444
  6. 03085810    00015802  6666 1111 2222 3333          0.01 00 成功 [L3][300]            IDEABCDEC    555555
复制代码
该文件每列定长,第一行ABCD..不存在,每行第57至84位为E列数据,现需处理该文件使其为以下格式文件:处理过后E列所占的长度不变

  1. 03085810    00015802  2200000000111223445          5.00 失败1,ABC                    IDEABCDEC    111111
  2. 03085810    00015802  6666 1111 2222 3333          7.50 AS 失败2                     IDEABCDEC    222222
  3. 03085810    00015802  6666 1111 2222 3333          2.00 失败3                        IDEABCDEC    333333      
  4. 03085810    00015802  6666 1111 2222 3333        398.00 失败4                        IDEABCDEC    444444
  5. 03085810    00015802  6666 1111 2222 3333          0.01 成功                         IDEABCDEC    555555
复制代码

作者: ly5066113    时间: 2015-08-12 11:45
回复 1# Ladore


目测:
  1. sed 's/\[.*]//' file
复制代码

作者: jason680    时间: 2015-08-12 12:05
回复 1# Ladore

03085810    00015802  9200000000111223445          5.00 14 失败1 [L105303][3.20]     IDEABCDEC    111111

>> ...每行第57至84位为E列数据...

$ awk 'BEGIN{FIELDWIDTHS="56 27 99"}{sub(/^[0-9]+ +/,"",$2);sub(/ .+/,"",$2);print}' a.txt
03085810    00015802  9200000000111223445          5.00  失败1     IDEABCDEC    111111
03085810    00015802  6666 1111 2222 3333          7.50  失败2     IDEABCDEC    222222
03085810    00015802  6666 1111 2222 3333          2.00  失败3     IDEABCDEC    333333      
03085810    00015802  6666 1111 2222 3333        398.00  失败4     IDEABCDEC    444444
03085810    00015802  6666 1111 2222 3333          0.01  成功     IDEABCDEC    555555

   
作者: hjfeng1988    时间: 2015-08-12 13:55
  1. awk '{str=substr($0,57,27);sub(/^[0-9]+ +/,"",str);sub(/ .+/,"",str);printf("%s%-27s%s\n",substr($0,0,56),str,substr($0,84))}' file
复制代码

作者: Ladore    时间: 2015-08-12 14:14
回复 4# hjfeng1988


谢谢

   
作者: Ladore    时间: 2015-08-12 14:59
hjfeng1988 发表于 2015-08-12 13:55

正则表达式中 如果有   14 AS  失败2 [L107859][3.20]   这种字符串,该怎么截取了,谢谢
作者: hjfeng1988    时间: 2015-08-12 15:10
回复 6# Ladore
  1. awk '{str=substr($0,57,27);sub(/^[0-9]+ +/,"",str);sub(/ \[.+/,"",str);printf("%s%-27s%s\n",substr($0,0,56),str,substr($0,84))}' file
复制代码

作者: Ladore    时间: 2015-08-12 16:42
本帖最后由 Ladore 于 2015-08-12 16:42 编辑

回复 3# jason680

这样写: awk 'BEGIN{FIELDWIDTHS="56 28 99"}{sub(/^[0-9]+ +/,"",$2);sub(/ \[.+/,"",$2);print}'  a.txt  就不会是定长的了
  1. 03085810    00015802  9200000000111223445          5.00  失败1,ABC  IDEABCDEC    111111
  2. 03085810    00015802  6666 1111 2222 3333          7.50  AS 失败2  IDEABCDEC    222222
  3. 03085810    00015802  6666 1111 2222 3333          2.00  失败3  IDEABCDEC    333333
  4. 03085810    00015802  6666 1111 2222 3333        398.00  失败4  IDEABCDEC    444444
  5. 03085810    00015802  6666 1111 2222 3333          0.01  成功  IDEABCDEC    555555
复制代码
该问题已经解决,谢谢大家!
   
作者: jason680    时间: 2015-08-12 16:47
回复 8# Ladore


    printf or sprintf can work fine




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2