复制第一列中的字段

复制第一列中的字段

我有以下输入

L12194C;               
           ;1;8;12     
           ;2;30;46    
           ;3;49;71    
           ;4;0;0      
           ;5;0;0      
           ;6;1;3      
L15698A2;              
           ;4;2;4      
           ;5;0;0      
           ;6;0;0      
L2281A2;               
           ;4;1;2      
           ;5;0;0      
12302C;                
           ;1;8;11     
           ;2;1;1      
           ;3;1;1      
           ;4;1;2      
           ;5;2;4      
           ;6;0;0      

我想要的输出是

L12194C;1;8 ;12        
L12194C;2;30;46        
L12194C;3;49;71        
L12194C;4;0;0          
L12194C;5;0;0          
L12194C;6;1;3          

L15698A2;4;2;4         
L15698A2;5;0;0         
L15698A2;6;0;0         

L2281A2;4;1;2          
L2281A2;5;0;0          

12302C;1;8;11          
12302C;2;1;1           
12302C;3;1;1           
12302C;4;1;2           
12302C;5;2;4           
12302C;6;0;0           

答案1

使用AWk

awk '!/^[[:blank:]]/{j=$1;print "";next}{print j$1}' FILENAME

输出:

L12194C;;1;8;12
L12194C;;2;30;46
L12194C;;3;49;71
L12194C;;4;0;0
L12194C;;5;0;0
L12194C;;6;1;3

L15698A2;;4;2;4
L15698A2;;5;0;0
L15698A2;;6;0;0

L2281A2;;4;1;2
L2281A2;;5;0;0

12302C;;1;8;11
12302C;;2;1;1
12302C;;3;1;1
12302C;;4;1;2
12302C;;5;2;4
12302C;;6;0;0

答案2

也许是这样的:

sed -E '
    1{ h; d; }
    /^[^ \t]/{ h; s/.*//; p; d; }
    s/^[ \t]+;//; G; s/^(.*)\n(.*)$/\2\1/'

输出:

L12194C;1;8;12
L12194C;2;30;46
L12194C;3;49;71
L12194C;4;0;0
L12194C;5;0;0
L12194C;6;1;3

L15698A2;4;2;4
L15698A2;5;0;0
L15698A2;6;0;0

L2281A2;4;1;2
L2281A2;5;0;0

12302C;1;8;11
12302C;2;1;1
12302C;3;1;1
12302C;4;1;2
12302C;5;2;4
12302C;6;0;0

答案3

场是恒定的吗?意思是, ; 之间的每个字段都是相关数据...如果这些字段是恒定的,就个人而言,我会使用诸如 sqlite 之类的数据库并将数据插入数据库,然后使用查询以您的方式输出数据需要它。您还可以使用数组,然后也以这种方式排列输出中的字段。

答案4

其他sed

sed -ne'h;s/.*//p;x;:n' -e'N;s/;.* //p;tn' -eD <in >out

sed将模式空间的副本保存到h旧空间,s///替换所有模式空间并p打印结果,然后 ex更改h旧空间和模式空间。这发生在每个非空白的第一字段行上,并在适当的情况下在输出中获取分隔空白。

对于每隔一行,还会在插入的 ewline 分隔符后面sed附加ext ,然后尝试替换第一个分号和最后一个空格之间的所有模式空间。如果这两个字符都出现在模式空间中,则替换成功,并分支回ext 标签以重试。N\ns///tsed:n

否则,在从顶部开始使用剩余的内容之前,sed D先删除并包括模式空间中第一个出现的ewline。\n

我的结果:

L12194C;1;8;12
L12194C;2;30;46
L12194C;3;49;71
L12194C;4;0;0
L12194C;5;0;0
L12194C;6;1;3

L15698A2;4;2;4
L15698A2;5;0;0
L15698A2;6;0;0

L2281A2;4;1;2
L2281A2;5;0;0

12302C;1;8;11
12302C;2;1;1
12302C;3;1;1
12302C;4;1;2
12302C;5;2;4

相关内容