集計されたデータを最初の列の数値に基づいて縮小された2列テーブルに変換する方法

集計されたデータを最初の列の数値に基づいて縮小された2列テーブルに変換する方法

次の行を含むビッグデータがあります。

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

データはtxt形式で、新しいファイルを作成し、このデータを次の2つの列に変換したいと思います。

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

1行バージョン:

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(不変ハッシュ)機能です。上から1行ずつ入力すると、スペースで区切られます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) 

最後に、データ構造が繰り返され、1行put(タブ区切り)ごとに1つのキー/値のペアが出力されます。

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

関連情報