Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 从文本文件格式化数据_Unix_Awk - Fatal编程技术网

Unix 从文本文件格式化数据

Unix 从文本文件格式化数据,unix,awk,Unix,Awk,我有以下格式的数据存储在一个文件中 ABC:9804 { "count" : 492, "_shards" : { "total" : 19, "successful" : 19, "failed" : 0 } } Bye ABC:95023 { "count" : 865, "_shards" : { "total" : 1

我有以下格式的数据存储在一个文件中

    ABC:9804
    {
      "count" : 492,
      "_shards" : {
        "total" : 19,
        "successful" : 19,
        "failed" : 0
      }
    }
    Bye
    ABC:95023
    {
      "count" : 865,
      "_shards" : {
        "total" : 19,
        "successful" : 19,
        "failed" : 0
      }
    }
    Bye
    ABCC:128
    {
      "count" : 479,
      "_shards" : {
        "total" : 19,
        "successful" : 19,
        "failed" : 0
      }
    }
    Bye
我正试图得到像这样的输出

ABC:9804 , 492
ABC:95023 , 865
ABCC:128 , 479
我尝试使用awk获得第一个like和第三个line,但这不起作用。

awk解决方案:

awk '/^ABC.*:/{ abc=$0 }$0~/"count"/{ gsub(/[^0-9]+/,"",$0); print abc" , "$0 }' file
输出:

ABC:9804 , 492
ABC:95023 , 865
ABCC:128 , 479
awk解决方案:

awk '/^ABC.*:/{ abc=$0 }$0~/"count"/{ gsub(/[^0-9]+/,"",$0); print abc" , "$0 }' file
输出:

ABC:9804 , 492
ABC:95023 , 865
ABCC:128 , 479
输入

输出

呆呆地看

可读性更好

awk -F':' -v RS='[{},\n]' '
                           /ABC.*|\"count"/{
                                 gsub(/[\n\t ]+/,""); 
                                 printf /\"/? ", " $2 "\n": $0
                           }
                          ' infile
awk -F'[ ,]' -v OFS=", " '
                         /^[ \t]+(ABC.*|\"count\"[ ]?):/{ 
                                    sub(/^[ \t]+/,"");  
                                    printf /\"/ ? OFS $(NF-1) RS:  $0  
                         }
                         ' infile
不呆呆地看

可读性更好

awk -F':' -v RS='[{},\n]' '
                           /ABC.*|\"count"/{
                                 gsub(/[\n\t ]+/,""); 
                                 printf /\"/? ", " $2 "\n": $0
                           }
                          ' infile
awk -F'[ ,]' -v OFS=", " '
                         /^[ \t]+(ABC.*|\"count\"[ ]?):/{ 
                                    sub(/^[ \t]+/,"");  
                                    printf /\"/ ? OFS $(NF-1) RS:  $0  
                         }
                         ' infile
输入

输出

呆呆地看

可读性更好

awk -F':' -v RS='[{},\n]' '
                           /ABC.*|\"count"/{
                                 gsub(/[\n\t ]+/,""); 
                                 printf /\"/? ", " $2 "\n": $0
                           }
                          ' infile
awk -F'[ ,]' -v OFS=", " '
                         /^[ \t]+(ABC.*|\"count\"[ ]?):/{ 
                                    sub(/^[ \t]+/,"");  
                                    printf /\"/ ? OFS $(NF-1) RS:  $0  
                         }
                         ' infile
不呆呆地看

可读性更好

awk -F':' -v RS='[{},\n]' '
                           /ABC.*|\"count"/{
                                 gsub(/[\n\t ]+/,""); 
                                 printf /\"/? ", " $2 "\n": $0
                           }
                          ' infile
awk -F'[ ,]' -v OFS=", " '
                         /^[ \t]+(ABC.*|\"count\"[ ]?):/{ 
                                    sub(/^[ \t]+/,"");  
                                    printf /\"/ ? OFS $(NF-1) RS:  $0  
                         }
                         ' infile

不它并不完全是JSON。我会改正我的题目。不。。它并不完全是JSON。我将更正我的主题。您也可以将第一位保存到变量中,并在找到第二位时使用普通的
打印,但这两种方法都有效。@TomFenech,好的,现在它变短了一点。您也可以将第一位保存到变量中,并在找到第二位时使用普通的
打印,但这两种方法都有效。@TomFenech,好吧,现在它变短了一点