加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何将列表转换为bash中的表

发布时间:2020-12-15 21:06:20 所属栏目:安全 来源:网络整理
导读:我想将一个项目列表(键/值对)转换为表格格式.解决方案可以是bash脚本,awk,sed或其他一些方法. 假设我有一个很长的列表,例如: date and time: 2013-02-21 18:18 PMfile size: 1283483 byteskey1: valuekey2: valuedate and time: 2013-02-21 18:19 PMfile si
我想将一个项目列表(键/值对)转换为表格格式.解决方案可以是bash脚本,awk,sed或其他一些方法.

假设我有一个很长的列表,例如:

date and time: 2013-02-21 18:18 PM
file size: 1283483 bytes
key1: value
key2: value

date and time: 2013-02-21 18:19 PM
file size: 1283493 bytes
key2: value

...

我想转换为带有制表符或其他分隔符的表格格式,如下所示:

date and time   file size   key1    key2
2013-02-21 18:18 PM 1283483 bytes   value   value
2013-02-21 18:19 PM 1283493 bytes       value
...

或者像这样:

date and time|file size|key1|key2
2013-02-21 18:18 PM|1283483 bytes|value|value
2013-02-21 18:19 PM|1283493 bytes||value
...

我已经看过像这个An efficient way to transpose a file in Bash这样的解决方案,但似乎我在这里遇到了不同的情况. awk解决方案部分适用于我,它不断将所有行输出到一个长列列中,但我需要将列限制为唯一列表.

awk -F': ' '
{ 
    for (i=1; i<=NF; i++)  {
        a[NR,i] = $i
    }
}
NF>p { p = NF }
END {    
    for(j=1; j<=p; j++) {
        str=a[1,j]
        for(i=2; i<=NR; i++){
            str=str" "a[i,j];
        }
        print str
    }
}' filename

UPDATE

感谢所有提供解决方案的人.其中一些看起来非常有前景,但我认为我的工具版本可能已经过时,我得到一些语法错误.我现在看到的是,我并没有以非常明确的要求开始.在我阐述完整要求之前,我很荣幸能够成为第一个提供解决方案的人.我写了这个问题已经度过了漫长的一天,因此不太清楚.

我的目标是提出一个非常通用的解决方案,用于将多个项目列表解析为列格式.我认为该解决方案不需要支持超过255列.列名不会提前知道,这样解决方案将适用于任何人,而不仅仅是我.两个已知的东西是kev /值对(“:”)和列表之间的分隔符(空行)之间的分隔符.为这些变量设置一个变量会很好,这样它们就可以配置给其他人来重用它.

从查看提出的解决方案,我意识到一个好的方法是对输入文件进行两次传递.第一步是收集所有列名,可选择对它们进行排序,然后打印标题.其次是抓取列的值并打印它们.

解决方法

这是一个纯粹的awk解决方案:

# split lines on ": " and use "|" for output field separator
BEGIN { FS = ": "; i = 0; h = 0; ofs = "|" }

# empty line - increment item count and skip it
/^s*$/ { i++ ; next } 

# normal line - add the item to the object and the header to the header list
# and keep track of first seen order of headers
{
   current[i,$1] = $2
   if (!($1 in headers)) {headers_ordered[h++] = $1}
   headers[$1]
}

END {
   h--

   # print headers
   for (k = 0; k <= h; k++)
   {
      printf "%s",headers_ordered[k]
      if (k != h) {printf "%s",ofs}
   } 
   print "" 

   # print the items for each object
   for (j = 0; j <= i; j++)
   {
      for (k = 0; k <= h; k++)
      {
         printf "%s",current[j,headers_ordered[k]]
         if (k != h) {printf "%s",ofs}
      }
      print ""
   }
}

示例输入(请注意,在最后一项之后应该有换行符):

foo: bar
foo2: bar2
foo1: bar

foo: bar3
foo3: bar3
foo2: bar3

示例输出:

foo|foo2|foo1|foo3
bar|bar2|bar|
bar3|bar3||bar3

注意:如果您的数据中嵌入了“:”,则可能需要更改此项.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读