다음과 같은 big data.txt 파일이 있습니다.
6712,04444
6712,02344
6712,02220
6712,02233
5322,00040
5322,02230
5322,42002
4444,03342
4444,03323
11,42023
11,00000
11,23443
11,23232
그런 다음 원시 데이터에서 다음과 같은 data.txt를 만들고 싶습니다.
col6712 col5322 col4444 col11
04444 00040 03342 42023
02344 02230 03323 00000
02220 42002 23443
02233 23232
실제로 원본 파일의 첫 번째 열이 열 번호가 되기를 원하며, 원본 파일의 각 행의 내부 부분은 관련 열 아래에 있어야 합니다. 내 목표를 달성할 수 있는 Linux 명령이 있습니까?
답변1
그리고gnu
datamash
:
datamash -t, -s -g 1 collapse 2 <data.txt | tr , \\t | datamash --no-strict --filler '' transpose
datamash
입력을 정렬해야 하므로 출력은 다음과 같습니다 .
11 4444 5322 6712
42023 03342 00040 04444
00000 03323 02230 02344
23443 42002 02220
23232 02233
작동 방식:
첫 번째는 st 필드로 구분된 입력을 정렬 datamash
s
하고 g
그룹화하여 첫 번째 열의 고유 값에 해당하는 nd 열의 값을 쉼표로 구분된 목록에 배치합니다. 그런 다음 모든 쉼표는 abs로 변환되고 두 번째는 행/열을 바꾸어 필드 수가 다른 행이 통과하도록 허용하고 누락된 값을 (빈 필드)로 채웁니다.,
1
collaps
2
tr
\\t
datamash
--no-strict
''
참고로, 예제 입력의 행은 첫 번째 필드별로 그룹화되고 역순으로 정렬되었으므로 실제로 동일한 순서를 얻으려면 두 번째 필드로 연결하기 전에 다시 정렬할 수 있습니다 datamash
.
datamash -t, -s -g 1 collapse 2 <data.txt | tr , \\t | \
sort -k1nr | datamash --no-strict --filler '' transpose
원하는 출력을 생성합니다.
6712 5322 4444 11
04444 00040 03342 42023
02344 02230 03323 00000
02220 42002 23443
02233 23232