첫 번째 열의 필드를 복사합니다.

첫 번째 열의 필드를 복사합니다.

나는 다음과 같은 입력을 가지고 있습니다

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결과를 인쇄한 후 기존 공간과 패턴 공간을 x변경합니다 . h이는 비어 있지 않은 모든 첫 번째 필드 줄에서 발생하며 적절한 경우 출력에서 ​​구분 공백을 가져옵니다.

다른 모든 줄의 경우 ext는 삽입된 줄바꿈 구분 기호에 추가된 sed다음 첫 번째 세미콜론과 마지막 공백 사이의 모든 패턴 공백을 바꾸려고 시도합니다. 패턴 공간에 두 문자가 모두 나타나면 교체가 성공하고 다시 시도하기 위해 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

관련 정보