次の行を含むビッグデータがあります。
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