我有一个名为 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'
基本上,它的作用是:
- 按制表符分割每一行
-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}}
使用示例:
$ 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/