使用'sed'或'awk'进行数据转换任务

san*_* mk 1 linux awk sed

我有这种格式的数据(像这样的很多行):

TASK : Task 1  
TASK : Task 2  
TASK : Task 3  
OWNER : Emp 1  
OWNER : Emp 2  
OWNER : Emp 3  
Deadline : Monday  
Deadline : Tuesday  
Deadline : Wednesday  
Run Code Online (Sandbox Code Playgroud)

这个,我想转换为:

TASK          OWNER           Deadline
Task 1       Emp 1            Monday  
Task 2       Emp 2            Tuesday  
Task 3       Emp 3            Wednesday
Run Code Online (Sandbox Code Playgroud)

即使我可以在没有列标题名称的情况下提取每个列,它也会很好.之后我可以手动添加列名.

有没有办法用'awk'或'sed'来做?

Ken*_*ent 5

awk的一种方式:

 awk -F': *' '{i=NR%3;i=i?i:3;a[i]=a[i]?a[i]"\t"$2:$2}
              END{for(x=1;x<=length(a);x++)print a[x]}' file
Run Code Online (Sandbox Code Playgroud)

它保留了订单,省略了标题行:

kent$  cat f
TASK : Task 1  
TASK : Task 2  
TASK : Task 3  
OWNER : Emp 1  
OWNER : Emp 2  
OWNER : Emp 3  
Deadline : Monday  
Deadline : Tuesday  
Deadline : Wednesday 

kent$  awk -F': *' '{i=NR%3;i=i?i:3;a[i]=a[i]?a[i]"\t"$2:$2}END{for(x=1;x<=length(a);x++)print a[x]}' f
Task 1          Emp 1   Monday  
Task 2          Emp 2   Tuesday  
Task 3          Emp 3   Wednesday
Run Code Online (Sandbox Code Playgroud)

说明

 awk -F': *'             #":any <space>" as FS
 '{i=NR%3;i=i?i:3;       #take NR%3 in i, if i=0, set i=3. because
                         #we want the i=0 case at the end of the output
 a[i]=a[i]?a[i]"\t"$2:$2}#concatenate the 2nd column to an array
 END{for and print}' file#print the content of the array at the end
Run Code Online (Sandbox Code Playgroud)

头

我们可以将标题保存在var中h并在打印之前将其打印出来a (array):

awk -F': *' '{...h=i==1?(h?h"\t"$1:$1):h;a[i]=..} 
END{print h;for...}' file
Run Code Online (Sandbox Code Playgroud)