입력 파일:
A B C D
1 2,3,4,5 6,7 8,9,10,11
결과물 파일:
A B C D
1 2 6 8
3 7 9
4 10
5 11
답변1
perl -MList::Util=max -lane '
@F = map {[split /,/]} @F;
$n = max map {scalar @$_} @F;
foreach $i (0..$n-1) {print join "\t", map {$_->[$i]} @F};
' file
답변2
GNU를 사용하여 datamash
데이터를 두 번 바꿉니다. 첫 번째 전치는 공백을 입력 구분 기호로 사용하고 쉼표를 출력 구분 기호로 사용하여 수행됩니다. 귀하의 질문에 대한 예를 바탕으로 다음과 같은 데이터를 제공합니다.
A,1
B,2,3,4,5
C,6,7
D,8,9,10,11
그런 다음 엄격 모드를 끄고(레코드의 필드 수가 동일할 필요는 없음) 공백을 누락된 필드로 추가하면서 입력 및 출력 구분 기호로 쉼표를 사용하여 다시 전치합니다. 이로 인해
A,B,C,D
1,2,6,8
,3,7,9
,4, ,10
,5, ,11
그런 다음 결과를 실행하여 column
질문과 유사한 멋진 테이블로 형식을 지정합니다.
A B C D
1 2 6 8
3 7 9
4 10
5 11
완전한 명령 파이프라인:
datamash -W --output-delimiter=, transpose <file |
datamash -t , --filler=' ' --no-strict transpose |
column -s , -t
답변3
awk
+ 로 paste
:
awk '{
for(i=1; i<=NF; i++) {
gsub(",", "\n", $i); close("col_"i); print $i >>"col_"i
}
}' infile && paste col_*
노트:
- 나중에 awk에 의해 생성된 임시 파일을 삭제할 수 있습니다
rm -f col_*
.\ - 열을 적절하게 정렬
paste
하기 위해 명령 출력을 에 전달할 수도 있습니다 .|column -s $'\t' -tn
두 개의 열에 두 개의 파일을 인쇄합니다.더 알아보기.
답변4
사용행복하다(이전 Perl_6)
raku -e 'lines[0].put; my @a; @a.push( $_.split(",")) for lines.split("\t"); \
my $i = @a>>.elems.max; my @b; for @a -> $a { for ^$i { \
@b[$++].push($a[$_] // "␀".Str)}}; \
$_.put for @b>>.join("\t");' file
또는
raku -e 'lines[0].put; my @a; @a.push: $_.split(",") for lines.split("\t"); \
my $i = @a>>.elems.max; my @b; for @a -> $a { \
@b[$++].push($a[$_] // "␀".Str) for ^$i }; \
put($_, "\t") for [Z] @b.rotor($i);' file
입력 예:
A B C D
1 2,3,4,5 6,7 8,9,10,11,12
출력 예(열 구분 \t
):
A B C D
1 2 6 8
␀ 3 7 9
␀ 4 ␀ 10
␀ 5 ␀ 11
␀ ␀ ␀ 12
위의 내용은 Perl 프로그래밍 언어 계열인 Raku로 작성된 솔루션입니다. 입력 텍스트 파일이 다음과 같다고 가정합니다.두 줄(수백 개에 달할 수도 있는) 열 사이에 탭으로 구분된 각 \t
줄과 ,
각 열에 있는 요소를 구분하는 쉼표가 있는 파일입니다.
간단히 말해서 첫 번째 줄은 put
헤더 줄입니다. 배열은 @a
후속 행으로 채워지며 \t
먼저 탭(열 표시)으로 분할된 다음 ,
쉼표로 분할됩니다. @a
그런 다음 배열의 가장 긴 요소를 계산하는 데 사용합니다 @a>>.elems.max;
. 그런 다음 요소는 @a
새로 선언된 배열에 복사되지만 Raku의 "define-OR" 연산자는 정의되지 않은 위치에 삽입하는 데 사용된다는 @b
점에 유의하는 것이 중요합니다 . (이 코드는 빈 문자열에도 작동합니다 .) 마지막으로 배열 데이터가 (인쇄) 출력됩니다.//
␀
"".Str
@b
put
[출력의 열이 올바르게 정렬되었습니다. 잘못된 정렬은 자리 표시자 문자 ]의 너비로 인해 발생합니다 ␀
.
예를 들어 공백으로 구분된 경우 헤더 행을 먼저 (개별적으로) 처리할 수 있습니다.
my $header=lines[0].split("\s"); $header.join("\t").put;
또는 (더 쉽게)
lines[0].split("\s").join("\t").put;