나는 다음과 같은 입력을 가지고 있습니다
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
\n
s///
t
sed
: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