我有一个大数据,其中的行如下:
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