여러 열을 만드는 데 도움이 필요합니다.

여러 열을 만드는 데 도움이 필요합니다.

데이터를 여러 열로 변환해야 합니다. 입력 데이터:

a1 n1
a2 n2
a3 n3
.  .
.  .
.  .
an nn
a1 m1
a2 m2
a3 m3
.  .
.  .
.  .
an mn
a1 x1
a2 x2
a3 x3
.  .
.  .
.  .
an xn
a1 y1
a2 y2
a3 y3
.  .
.  .
.  .
an yn
a1 z1
a2 z2
a3 z3
.  .
.  .
.  .
an zn

위의 데이터를 여러 열로 변환하고 싶습니다. 내 출력 데이터가 다음과 같기를 원합니다.

a1 n1 m1 x1 y1 z1
a2 n2 m2 x2 y2 z2
a3 n3 m3 x3 y3 z3
.  .  .  .  .  .
.  .  .  .  .  . 
.  .  .  .  .  .
an nn mn xn yn zn

이 변환을 도와주세요. 저는 리눅스를 사용하고 있습니다.

감사해요.

답변1

다음은 awk와 함께 연관 배열을 사용하는 좋은 예입니다.

$ awk  '{a[$1]=a[$1]"   "$2} END {for (i in a) print i, a[i]}' q763033 
a1    n1   m1   x1   y1   z1
a2    n2   m2   x2   y2   z2
a3    n3   m3   x3   y3   z3
an    nn   mn   xn   yn   zn

입력 파일 q763033은 다음과 같습니다.

$ cat q763033
a1 n1
a2 n2
a3 n3
an nn
a1 m1
a2 m2
a3 m3
an mn
a1 x1
a2 x2
a3 x3
an xn
a1 y1
a2 y2
a3 y3
an yn
a1 z1
a2 z2
a3 z3
an zn

답변2

사용 datamash:

$ datamash -sW -c $'\t' collapse 2 -g 1 <file

또는

$ datamash -sW --output-delimiter=' ' -c ' ' collapse 2 -g 1 <file

~에서datamash수동:

--출력 구분 기호=x

출력 필드 구분 기호로 문자 X를 사용합니다. 이 옵션은 무시됩니다 --field-separator/-t/ --whitespace/-W.

--접기 구분 기호=x

-cx

"축소된" 또는 "고유" 목록의 항목을 구분하려면 쉼표 대신 X 문자를 사용하십시오.

답변3

mlrfile공백으로 구분된 데이터의 첫 번째 필드가 "키"이고 두 번째 필드가 "값"이라고 가정하면 Miller()를 사용하여 다음과 같이 파일에서 각 키에 대한 모든 값을 수집할 수 있습니다 .

$ cat file
a1 n1
a2 n2
a3 n3
an nn
a1 m1
a2 m2
a3 m3
an mn
a1 x1
a2 x2
a3 x3
an xn
a1 y1
a2 y2
a3 y3
an yn
a1 z1
a2 z2
a3 z3
an zn
$ mlr --from file --nidx nest -f 2 --ivar space
a1 n1 m1 x1 y1 z1
a2 n2 m2 x2 y2 z2
a3 n3 m3 x3 y3 z3
an nn mn xn yn zn

이는 데이터를 Unix Toolbox 형식 파일(공백으로 구분된 필드, 줄 바꿈으로 구분된 레코드)로 읽은 다음 두 번째 필드에 데이터를 "중첩"하여 공유된 두 번째 필드를 포함하는 새 레코드를 생성합니다. 모든 값이 포함된 첫 번째 필드 ​​분야에서는 동일합니다. 공백은 중첩된 데이터를 구분하므로 첫 번째 필드가 하나의 필드이고 다른 필드가 다른 필드임을 알 수 있는 방법이 없습니다.

출력을 JSON으로 변환하면 실제로 생성된 내용이 표시됩니다.

$ mlr --from file --n2j nest -f 2 --ivar space
[
{
  "1": "a1",
  "2": "n1 m1 x1 y1 z1"
},
{
  "1": "a2",
  "2": "n2 m2 x2 y2 z2"
},
{
  "1": "a3",
  "2": "n3 m3 x3 y3 z3"
},
{
  "1": "an",
  "2": "nn mn xn yn zn"
}
]

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne 'BEGIN my %hash; %hash.push: .split(/ \s+ /); END .kv.put for %hash.sort;'  file

이것은 Perl 프로그래밍 언어 중 하나인 Raku로 작성된 답변입니다. Raku는 유니코드에 대한 고급 지원을 제공합니다(데이터세트에 문제가 있는 경우).

awk의 -ne자동 인쇄가 아닌 한 줄씩 플래그를 사용하여 (연관 배열) BEGIN을 선언합니다 . %hash코드 본문에서 두 개의 열은 split여백 에 배치되고 항목을 "키-값" 쌍으로 이해하는 push에 추가됩니다 . %hash알려진 모든 키에 대한 모든 새 값이 누적된 다음 버전 (요소 사이의 표준 간격) END만 출력합니다 .putkv

입력 예:

a1 n1
a2 n2
a3 n3
an nn
a1 m1
a2 m2
a3 m3
an mn
a1 x1
a2 x2
a3 x3
an xn
a1 y1
a2 y2
a3 y3
an yn
a1 z1
a2 z2
a3 z3
an zn

출력 예(위의 최종 문 사용):

a1 n1 m1 x1 y1 z1
a2 n2 m2 x2 y2 z2
a3 n3 m3 x3 y3 z3
an nn mn xn yn zn

출력 예( .say대신 사용 .kv.put):

a1 => [n1 m1 x1 y1 z1]
a2 => [n2 m2 x2 y2 z2]
a3 => [n3 m3 x3 y3 z3]
an => [nn mn xn yn zn]

마지막으로 필요한 경우 JSON으로 변환할 수 있습니다.

~$ raku -MJSON::Tiny -ne 'BEGIN my %hash; %hash.push: .split(/ \s+ /); END put to-json( %hash );'  file
[ { "a1" : [ "n1", "m1", "x1", "y1", "z1" ] }, { "a2" : [ "n2", "m2", "x2", "y2", "z2" ] }, { "a3" : [ "n3", "m3", "x3", "y3", "z3" ] }, { "an" : [ "nn", "mn", "xn", "yn", "zn" ] } ]

https://docs.raku.org/언어/hashmap
https://raku.org

관련 정보