【问题标题】:convert log data into delimited text file using shell scripting使用 shell 脚本将日志数据转换为分隔的文本文件
【发布时间】:2019-06-10 19:33:46
【问题描述】:

我想使用 unix shell 脚本转换数据(日志文件)以下数据 来自

key1=value1|key2=value2|key3=value3

key1=value1|key2=value2|key3=value3

key1=value1|key2=value2|key4=value4

key1=value1|key2=value2|key5=value5

key1=value1|key2=value2|key3=value3

到(分隔的文本文件)

key1|key2|key3|key4|key5

value1|value2|value3||

value1|value2|value3||

value1|value2||value4|

value1|value2|||value5   

value1|value2|value3||

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    如果你可以使用 bash,试试这个:

    #!/bin/bash
    
    # define headline
    headline="key1|key2|key3|key4|key5"
    
    # split headline into separat entries
    readarray -d '|' header <<< "$headline"
    
    # get last fieldnr in array
    lastfieldnr=$((${#header[@]} - 1))
    
    # write headline to output
    echo "$headline"
    
    # loop over all entry lines
    while read -r line; do
    
       # separate key=value pairs
       readarray -d '|' key_value <<< "$line"
    
       # define associative array
       declare -A content
    
       # loop over key=value pairs
       for kv in "${key_value[@]}"; do
    
          # split key value pair in separate fields
          # strip last |
          IFS='=' read -r key value <<< "${kv%|}"
    
          # save result in associative array
          content[$key]="$value"
       done  
    
       # initialize output
       output=""
    
       # loop over all fields
       for i in $(seq 0 $lastfieldnr); do
    
          # get length of key
          length="${#header[$i]}"
    
          # strip last character from key
          key="${header[$i]:0:$length - 1}"
    
          # if content[$key] not empty
          if [ -n "${content[$key]}" ]; then
    
             # get value
             value="${content[$key]}"
    
             # append value to output
             output+="$value"
          fi
    
          # append | at end of output
          output+="|"
       done
    
       # complete line to output, strip last |
       printf "%s\n" "${output%|}"
    
       # delete associateive array
       unset content
    done < file.log
    

    输入(file.log)

    key1=value1|key2=value2|key3=value3
    key1=value1|key2=value2|key3=value3
    key1=value1|key2=value2|key4=value4
    key1=value1|key2=value2|key5=value5
    key1=value1|key2=value2|key3=value3
    

    输出

    key1|key2|key3|key4|key5
    value1|value2|value3||
    value1|value2|value3||
    value1|value2||value4|
    value1|value2|||value5
    value1|value2|value3||
    

    【讨论】:

    • 谢谢 UtLox!你有 awk 的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 2015-08-27
    • 2016-12-22
    • 1970-01-01
    • 2020-12-17
    • 2017-06-24
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多