집계된 데이터를 첫 번째 열의 숫자를 기준으로 축소된 2열 테이블로 변환하는 방법

집계된 데이터를 첫 번째 열의 숫자를 기준으로 축소된 2열 테이블로 변환하는 방법

다음 행이 포함된 빅 데이터가 있습니다.

0   1 5 6 4
1   4 5 2 3
5   4 5 6 7

데이터는 txt 형식이며 새 파일을 만들고 이 데이터를 다음과 같은 두 개의 열로 변환하고 싶습니다.

0 1
0 5
0 6
0 4
1 4
1 5
1 2
1 3
5 4
5 5
5 6
5 7

도움을 주시면 감사하겠습니다!

답변1

이상한 솔루션

awk 실행 파일 conv_table.awk:

#! /usr/bin/awk -f

{
    # for all fields after the first column
    for (idx = 2; idx <= NF; idx++) {
        # print first column followed by another valued column
        print $1, $idx
    }
}

이는 다음과 같은 명령으로 실행될 수 있습니다.

chmod 755 conv_table.awk

다음과 같이 실행하세요:

./conv_table.awk table.txt > output.txt

한 줄 버전:

awk '{for(idx=2;idx<=NF;idx++){print $1,$idx}}' table.txt > output.txt

답변2

사용행복하다(이전 Perl_6)

raku -e 'for lines.map(*.words) {Map.new(.[0] => .[1..*-1]).invert.map(*.antipairs.put)};'   

또는

raku -ne 'Map.new(.[0] => .[1..*-1]).invert.map(*.antipairs.put) given .words;' 

입력 예:

0   1 5 6 4
1   4 5 2 3
5   4 5 6 7

예제 출력:

0   1
0   5
0   6
0   4
1   4
1   5
1   2
1   3
5   4
5   5
5   6
5   7

Raku 사용의 장점은 내장된 Hash(변경 가능) 및 Map(불변 해싱) 기능입니다. 위에서 한 줄씩 입력하면 공백으로 구분됩니다 words. 첫 번째 요소 .[0]는 키로 사용되고 나머지 요소는 .[1..*-1]값으로 사용됩니다. (참고로 =>"굵은 화살표"는 키/값 쌍을 구성합니다).

Map객체 내부에 들어가면 각 입력 줄은 기본적으로 다음과 같습니다.

key => [val1 val2 val3 val4]

개체를 원하는 출력으로 재배열할 수 있습니다. 먼저 개체를 invert편집하여 각 구조를 다음과 같이 확장합니다.

(val1 => key) (val2 => key) (val3 => key) (val4 => key) 

둘째, antipairs키/값 교환의 경우:

(key => val1) (key => val2) (key => val3) (key => val4) 

마지막으로 데이터 구조가 반복되어 한 put줄(탭으로 구분)당 하나의 키/값 쌍을 출력합니다.

https://docs.raku.org/type/Hash#Routines_supplied_by_class_Map
https://raku.org

답변3

mawk 'sub("^\n*",substr(_,OFS="\n"$!_" ",$!_=_),$!(NF=NF))'
0 1
0 5
0 6
0 4
1 4
1 5
1 2
1 3
5 4
5 5
5 6
5 7

관련 정보