쉼표로 구분된 필드를 별도의 줄로 분할하는 방법

쉼표로 구분된 필드를 별도의 줄로 분할하는 방법

입력 파일:

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@bput

[출력의 열이 올바르게 정렬되었습니다. 잘못된 정렬은 자리 표시자 문자 ]의 너비로 인해 발생합니다 .

예를 들어 공백으로 구분된 경우 헤더 행을 먼저 (개별적으로) 처리할 수 있습니다.

my $header=lines[0].split("\s"); $header.join("\t").put;

또는 (더 쉽게)

lines[0].split("\s").join("\t").put;

https://raku.org

관련 정보