다음과 같은 데이터가 포함된 파일이 있습니다.
1,2,3 4,5,6 7,8,9 12,22,0
나는 4개의 열이 있는 테이블을 만들고 싶습니다 a,b,c,d
. 이 열에는 a
첫 번째 열의 값이 있고 b
두 번째 열에는 해당 값이 있습니다.
위의 예에서 열은 다음과 같습니다.
a b c d
1 4 7 12
2 5 8 22
3 6 9 0
남은 거 아무거나. 특정 행의 열에 있는 항목은 동일합니다. 그러나 이러한 항목은 행마다 다를 수 있습니다. 예를 들어 일부 행에는 열당 쉼표로 구분된 항목이 1개만 있을 수 있고 일부 행에는 10개가 있을 수도 있습니다.
답변1
열 이름 지정 방법(사용자 입력, 사용할 각 열에 대해 미리 정의된 이름 등)이 명확하지 않습니다.
문자열을 열로 분할하려면 다음을 사용할 수 있습니다 sed
.
echo 1,2,3 4,5,6 7,8,9 12,22,0 | sed -n 'h;:a;g;s/,[^ ]*//gp;g;s/^[^, ]*,//;s/ [^,]*,/ /g;h;ta;p'
여기에서는 sed
전체 문자열을 버퍼에 복사하고( ) h
루프 의 줄을 반복하고( :a
.. ) 버퍼에서 복사된 문자열을 가져오고() 각 부분에서 첫 번째 숫자를 가져와(first ) 인쇄합니다( ). 변경되지 않은 문자열을 다시 검색하고 첫 번째 숫자(두 번째 및 세 번째 )를 제거한 다음 수정된 문자열을 다시 버퍼( )에 넣습니다. 이는 문자열 상태 에 있을 때에도 계속됩니다. 일단 사라지면 남은 것을 인쇄합니다 .ta
g
s
p
s
h
,
p
답변2
필요한 작업을 수행할 수 있습니다.
$ sed -Ee '
s/^/ /;y/ /\n/
:loop
s/(\n.*)\n([^,]*),/\2 \1 /
tloop
s/(.*) \n([^,]*),/\2 \1\n/
P;/,/D;s/.*\n//
' inp
다음 접근 방식은 각 열에서 선행 열 요소를 선택하여 인쇄할 행의 모양을 지정하는 것입니다.
또 다른 접근 방식은 쉼표 분할을 기반으로 열을 배열로 분할하는 것입니다. 그런 다음 하위 배열의 요소가 부족할 때까지 선행 요소를 이동합니다. 행당 번호가 동일하기 때문입니다.
$ perl -lane '$,=" ";
my @A = map { [split /,/] } @F;
print map { shift @$_ } @A while @{$A[0]};
' inp