linux - Linux中的合并和对齐线

标签 linux bash shell awk sed

我有一个名为 file1.txt 的文本文件。它需要像下面的预期输出一样对齐。 注意:输入文件 file1.txt 是 TAB 删除的,并且始终对齐。

                      DISK OK - free space:          CRITICAL
01-08-2018 07:05:05   Service Required     Critical  CPU:loadaverage 6.0%                    

01-08-2018 07:10:25   Service Alert        Critical  memoryUsage
                                                     :critical alert
                       DISK OK - free space:
02-08-2018 01:05:20    Service Alert       Warning   memoryUsage
                                                     :1.0,2.0,5.0


                                                     CRITICAl:outstanding alert attention 
02-08-2018 02:05:20    Service Alert       Critical  required 

预期输出:

 01-08-2018 07:05:05    DISK OK - free space:Service Required Critical    CRITICALservice requiredCPU:loadaverage 6.0%

 01-08-2018 07:10:25    Service Alert                         Critical    memoryUsage:critical alert

 02-08-2018 01:05:20    DISK OK - free space:Service Alert    Warning     memoryUsage:1.0,2.0,3.0

 02-08-2018 02:05:20    Service Alert                         Critical     CRITICAL:outstanding alert attention required

非常感谢任何建议。

最佳答案

您可以使用awk实现这一目标:

 awk -F"\t" '!$1{for(i=1;i<=NF;i++){line[i]=$i};next} {for(i=1;i<=NF;i++){printf i<NF?"%s%s%s":"%s%s%s\n",line[i],$i,FS}}' yourfile

如果您需要像此处一样将输出全部对齐(不是制表符分隔,而是更像固定宽度),您可以通过管道传输到 column

awk -F"\t" '!$1{for(i=1;i<=NF;i++){line[i]=$i}} $1{for(i=1;i<=NF;i++){printf i<NF?"%s%s%s":"%s%s%s\n",line[i],$i,FS}}' test.log | column -t -s $'\t'

基本上,它的作用是:

  1. 按制表符分割每一行 -F"\t"
  2. 如果第一列为空,则将该行的每一列以列号为索引收集到一个数组中,并继续处理下一条记录 !$1{for(i=1;i<=NF;i++){line[i]=$i};next}
  3. 如果我们仍在处理该行(第一个条件没有触发),则遍历每一列 {for(i=1;i<=NF;i++)
  4. 并打印出数组中存储的内容、当前行列的内容、字段分隔符(制表符)以及换行符(如果这是最后一列) {printf i<NF?"%s%s%s":"%s%s%s\n",line[i],$i,FS}}

使用示例:

$ cat test.log
        DISK OK - free space:           CRITICAL
1/8/2018 7:05:05        Service Required        Critical        CPU:loadaverage 6%

1/8/2018 7:10:25        Service Alert   Critical        memoryUsage
                        :critical alert
        DISK OK - free space:
2/8/2018 1:05:20        Service Alert   Warning memoryUsage
                        :1.0,2.0,5.0


                        CRITICAl:outstanding alert attention
2/8/2018 2:05:20        Service Alert   Critical        required

$ awk -F"\t" '!$1{for(i=1;i<=NF;i++){line[i]=$i};next} {for(i=1;i<=NF;i++){printf i<NF?"%s%s%s":"%s%s%s\n",line[i],$i,FS}}' test.log | column -t -s $'\t'
1/8/2018 7:05:05  DISK OK - free space:Service Required  Critical  CRITICALCPU:loadaverage 6%
1/8/2018 7:10:25  Service Alert                          Critical  memoryUsage
2/8/2018 1:05:20  DISK OK - free space:Service Alert     Warning   memoryUsage
2/8/2018 2:05:20  Service Alert                          Critical  CRITICAl:outstanding alert attentionrequired

关于linux - Linux中的合并和对齐线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398356/

相关文章:

arrays - 简单的 bash CSV 数组问题

linux - 在 bash 中设置 wget --header= 不起作用

python 读取 HID

c# - 构建解决方案以支持在 Linux 环境中发送邮件通知

regex - 仅打印以特定数值结尾的行

linux - 在 bash 中的每个命令后执行命令

linux - 为什么当 bash 被称为 sh 时,它的行为会有所不同?

linux - 用换行符替换空格,特殊字符包裹的空格除外

java - 如何在终端上打印的同时获取 linux 命令的输出?

c++ - 状态函数。如何通过变量给出参数?