bash 文件中行的值序列

sequence of values from line in file in bash

我有包含以下内容的文件:

id=123
time=1440367263
from=user1
version=none
final=none
id=124
time=1440367264
from=user2
version=none
final=none
etc...

但是,有时缺少 "from" 或 "final" 行,这会破坏序列。 示例:

id=123
time=1440367263
from=user1
version=none
final=none
id=124
time=1440367264
version=none
final=none
etc...

问题是,我正在尝试从中生成单行,根据示例 1,我生成的输出如下:

id=123 time=1440367263 from=user1 version=none final=none
id=124 time=1440367264 from=user2 version=none final=none

如果缺少某些值,则会破坏每行的顺序。 id, time, from, version, final

我如何维护这些顺序,如果有缺失值,请添加 =0 值以保持顺序?

如有任何帮助,我们将不胜感激,

谢谢, AL.

没有神奇的单行解决方案,您需要创建一个自定义脚本,例如:

  • 将 5 个变量(id、时间、来源、版本和最终)重置为值 0
  • 从文件中读取行,直到读取到以 "final" 开头的行(假设 final 始终存在...)。
  • 当你读取行时,填充相应的变量
  • 最终打印出包含您读取的变量的行

并循环直到文件结束。

像这样:

awk -F= '
    function report() {
        printf("id=%s time=%s from=%s version=%s final=%s\n",
               a["id"], a["time"], a["from"], a["final"])
    }
    function reset() {
        # Make sure the array a is empty
        delete a
        # Defining the fields in which we are interested
        a["id"]=a["time"]=a["from"]=a["version"]=a["final"]=0
    }
    =="id" {
         if ("id" in a) report()
         reset()
    }
     in a {a[]=} # Storing key + value 
                       # if we are interested in a field
' file

编辑:重新设计,据我了解现在的要求:)

我想 id 总是存在,我在它之前插入一个换行符

cat r |tr '\n' ' '|sed -r 's/(id=[^ ]+)/\n/g';echo

输出

id=123 time=1440367263 from=user1 version=none final=none 
id=124 time=1440367264 version=none final=none