如何将聚合数据转换为按第一列数字缩小的 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解决方案

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

相关内容