shell - 使用 shell 脚本将日志数据转换为带分隔符的文本文件
问题描述
我想使用 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||
解决方案
如果你可以使用 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
输入(文件.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||
推荐阅读
- excel - Excel 从非连续单元格中查找中位数并忽略 0 值
- angular - 在Angular7中将图像(来自外部库)保存到本地的PDF文件?
- jquery - 通过函数将`this`作为变量与jquery传递
- django - 模型可以有 ForeignKey 对象的列表吗?
- java - Spring Batch Partition 无法按预期工作
- python - python中的for循环在执行中被阻塞
- java - Jersey:如何在服务器端获取 POST 参数?
- github - 如何获取托管在 Github 上的所有 C++ 项目的列表?
- java - Servlet 异常映射
- javascript - 在 span 标签内应用 onclick 事件