V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
david_lee_cn
V2EX  ›  Linux

AWK替换问题

  •  
  •   david_lee_cn · 2012-02-17 18:15:21 +08:00 · 5432 次点击
    这是一个创建于 4667 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原始文本foo.txt内容
    IMSI=8671200001;
    ISDN=8612345;
    IMSI=8671200001;
    ISDN=8612345;
    IMSI=8671200001;
    ISDN=8612345;
    IMSI=8671200001;


    cat foo.txt | awk '{
    if($0 ~ /IMSI=/ {
    split($0,imsi_ary,"=")
    imsi=gsub(/;/,,imsi_ary[2])
    }
    print imsi
    }'

    问什么输出是
    1
    1
    1

    而不是想要的
    8671200001
    8671200001
    8671200001
    14 条回复    1970-01-01 08:00:00 +08:00
    david_lee_cn
        1
    david_lee_cn  
    OP
       2012-02-17 18:44:40 +08:00
    思维定势。

    imsi=gsub(/;/,,imsi_ary[2]) 实际得到gsub执行结果 1 或者0。

    直接gsub()即可改变imsi_ary[2]的值。

    closed。
    ufo22940268
        2
    ufo22940268  
       2012-02-21 11:09:04 +08:00
    awk的文档真是难懂阿,每次man awk都一头雾水
    gastlygem
        3
    gastlygem  
       2012-02-21 14:36:27 +08:00
    @ufo22940268 info awk 会让你雾水更多~
    ufo22940268
        4
    ufo22940268  
       2012-02-21 17:10:27 +08:00
    @gastlygem 咦,info awk和man awk显示的信息不是一样的吗?
    kojp
        5
    kojp  
       2012-02-21 17:42:37 +08:00
    Awk堪称很 锋利的 ! 尤其是对文本的处理 ...
    gastlygem
        6
    gastlygem  
       2012-02-21 19:33:10 +08:00
    @ufo22940268 如果你用gawk的话,info给你的是一本书……
    likuku
        7
    likuku  
       2012-02-21 19:43:28 +08:00
    grep "8671200001" | awk -F "=" '{print $2}' | awk -F ";" '{print $1}'
    iwinux
        8
    iwinux  
       2012-02-21 20:12:30 +08:00
    sed -e "s/\(IMSI\|ISDN\)=\([0-9]\+\);/\2/"
    iwinux
        9
    iwinux  
       2012-02-21 20:14:05 +08:00
    Sorry,应该是 grep "IMSI" | sed -e "s/\([0-9]\+\)/\1/"
    laiwei
        10
    laiwei  
       2012-02-21 21:19:51 +08:00 via Android
    grep ‘IMSI’ foo.txt|cut -d"=" -f2

    或者
    grep ‘IMSI’ foo.txt|awk -F "=" "{print $2}"

    或者
    awk -F "=" "/$1='IMSI'/{print $2}"
    Echoldman
        11
    Echoldman  
       2012-02-21 21:37:59 +08:00
    看成了“AFK”。。
    eric_q
        12
    eric_q  
       2012-02-21 22:53:46 +08:00
    这里用sed应该更省力些,除了@iwinux的写法,还可以这么写:
    cat foo.txt|grep -v ISDN|sed -e 's/IMSI\=//' -e's/\;//'
    vz33
        13
    vz33  
       2012-03-18 10:43:19 +08:00
    awk 'BEGIN{FS="=|;"}{if ($1=="IMSI")print $2}' foo.txt
    polyahu
        14
    polyahu  
       2012-03-23 10:16:00 +08:00
    grep -oP '(?<=IMSI=)\d+' foo.txt
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1161 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:41 · PVG 02:41 · LAX 10:41 · JFK 13:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.