删除字段以使用awk或sed获取值

时间:2017-08-22 06:51:15

标签: unix awk grep

我有一个包含以下数据的文本文件。

            \ {
                Name     "ABC",
                count   378
            }
            \ {
                Name     "DEF",
                count   5283
            }
            \ {
                Name     "BCD",
                count   152244
            }
            \ {
                Name     "XYZ",
                count   5688
            }
            \ {
                Name     "1A2B",
                count   1749132
            }

我想要的结果如下: -

            ABC , 378
            DEF , 5283
            BCD , 152244
            XYZ , 5688
            1A2B ,1749132

我尝试使用以下命令删除非重要数据: -

            grep -e '^ ' result.txt 

但我无法超越它。有人可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

尝试关注awk并告诉我这是否对您有所帮助。

awk '/Name/{gsub(/\"|\,/,"",$2);val=$2;next} /count/{print val " , " $2}'  Input_file

OR

awk -F'[",]' '/Name/{val=$2;next} /count/{split($0, a," ");print val,a[2]}' OFS=" , "  Input_file

答案 1 :(得分:1)

以下是您可以申请的另一个awk

$ awk '$2~/[0-9A-Z]/ {printf gsub(/"/,"",$2)?$2:" "$2"\n"}' file

简要说明,

  • $2~/[0-9A-Z]/:找到匹配正则表达式[0-9A-Z]
  • 的记录
  • gsub(/"/,"",$2):删除"中的$2,然后将其打印

答案 2 :(得分:1)

如果你使用支持正则表达式RS的awk(至少是gawk和mawk),你可以这样做:

awk '!(NR%2) { print $3 " , " $5  }' RS='\\ *{|}' FS='[\n," ]+' infile

输出:

ABC , 378
DEF , 5283
BCD , 152244
XYZ , 5688
1A2B , 1749132

答案 3 :(得分:0)

sed 解决方案:

sed -En '/[{}]/d;N; s/Name *"([^"]+)".*count *([0-9]+).*/\1 , \2/p;' file

输出:

        ABC , 378
        DEF , 5283
        BCD , 152244
        XYZ , 5688
        1A2B , 1749132