データを複数の列に変換する必要があります。入力データ:
a1 n1
a2 n2
a3 n3
. .
. .
. .
an nn
a1 m1
a2 m2
a3 m3
. .
. .
. .
an mn
a1 x1
a2 x2
a3 x3
. .
. .
. .
an xn
a1 y1
a2 y2
a3 y3
. .
. .
. .
an yn
a1 z1
a2 z2
a3 z3
. .
. .
. .
an zn
上記のデータを複数の列に変換したいです。私の出力データは次のようになりたいです。
a1 n1 m1 x1 y1 z1
a2 n2 m2 x2 y2 z2
a3 n3 m3 x3 y3 z3
. . . . . .
. . . . . .
. . . . . .
an nn mn xn yn zn
この変換を助けてください。私はLinuxを使用しています。
ありがとうございます。
答え1
以下は、awkで連想配列を使用する良い例です。
$ awk '{a[$1]=a[$1]" "$2} END {for (i in a) print i, a[i]}' q763033
a1 n1 m1 x1 y1 z1
a2 n2 m2 x2 y2 z2
a3 n3 m3 x3 y3 z3
an nn mn xn yn zn
入力ファイル q763033 は次のようになります。
$ cat q763033
a1 n1
a2 n2
a3 n3
an nn
a1 m1
a2 m2
a3 m3
an mn
a1 x1
a2 x2
a3 x3
an xn
a1 y1
a2 y2
a3 y3
an yn
a1 z1
a2 z2
a3 z3
an zn
答え2
使用datamash
:
$ datamash -sW -c $'\t' collapse 2 -g 1 <file
または
$ datamash -sW --output-delimiter=' ' -c ' ' collapse 2 -g 1 <file
~からdatamash
手動:
--出力区切り記号=x
出力フィールド区切り文字として文字Xを使用します。このオプションは無視されます
--field-separator/-t/ --whitespace/-W
。
--折りたたみ区切り記号= x
-cx
「縮小」または「固有」リストの項目を区切るには、カンマの代わりにX文字を使用します。
答え3
mlr
file
スペースで区切られたデータの最初のフィールドが「キー」で、2番目のフィールドが「値」であると仮定すると、Miller()を使用して、次のようにファイルから各キーのすべての値を収集できます。
$ cat file
a1 n1
a2 n2
a3 n3
an nn
a1 m1
a2 m2
a3 m3
an mn
a1 x1
a2 x2
a3 x3
an xn
a1 y1
a2 y2
a3 y3
an yn
a1 z1
a2 z2
a3 z3
an zn
$ mlr --from file --nidx nest -f 2 --ivar space
a1 n1 m1 x1 y1 z1
a2 n2 m2 x2 y2 z2
a3 n3 m3 x3 y3 z3
an nn mn xn yn zn
これは、データをUnix Toolboxフォーマットファイル(スペースで区切られたフィールド、改行で区切られたレコード)として読み取った後、データを2番目のフィールドに「入れ子にする」ことによって、共有された2番目のフィールドを含む新しいレコードを作成します。すべての値を含む最初のフィールド分野では同じです。スペースは入れ子になったデータを区別するため、最初のフィールドが1つのフィールドであり、他のフィールドが別のフィールドであることを知る方法はありません。
出力をJSONに変換すると、実際に生成された内容が表示されます。
$ mlr --from file --n2j nest -f 2 --ivar space
[
{
"1": "a1",
"2": "n1 m1 x1 y1 z1"
},
{
"1": "a2",
"2": "n2 m2 x2 y2 z2"
},
{
"1": "a3",
"2": "n3 m3 x3 y3 z3"
},
{
"1": "an",
"2": "nn mn xn yn zn"
}
]
答え4
使用幸せ(以前のPerl_6)
~$ raku -ne 'BEGIN my %hash; %hash.push: .split(/ \s+ /); END .kv.put for %hash.sort;' file
これはPerlプログラミング言語の1つであるRakuで書かれた答えです。 RakuはUnicodeの高度なサポートを提供します(データセットに問題がある場合)。
awkの-ne
自動印刷ではなく、1行ずつフラグを使用して(連想配列)BEGIN
を宣言します。%hash
コード本文では、2つの列がsplit
余白に配置され、項目を「キーと値」のペアとして理解するpush
ために追加されます。%hash
既知のすべてのキーのすべての新しい値が累積され、次のバージョン(要素間の標準間隔)のみがEND
出力されます。put
kv
入力例:
a1 n1
a2 n2
a3 n3
an nn
a1 m1
a2 m2
a3 m3
an mn
a1 x1
a2 x2
a3 x3
an xn
a1 y1
a2 y2
a3 y3
an yn
a1 z1
a2 z2
a3 z3
an zn
出力例(上記の最終文を使用):
a1 n1 m1 x1 y1 z1
a2 n2 m2 x2 y2 z2
a3 n3 m3 x3 y3 z3
an nn mn xn yn zn
出力例(.say
代わりに使用.kv.put
):
a1 => [n1 m1 x1 y1 z1]
a2 => [n2 m2 x2 y2 z2]
a3 => [n3 m3 x3 y3 z3]
an => [nn mn xn yn zn]
最後に、必要に応じてJSONに変換できます。
~$ raku -MJSON::Tiny -ne 'BEGIN my %hash; %hash.push: .split(/ \s+ /); END put to-json( %hash );' file
[ { "a1" : [ "n1", "m1", "x1", "y1", "z1" ] }, { "a2" : [ "n2", "m2", "x2", "y2", "z2" ] }, { "a3" : [ "n3", "m3", "x3", "y3", "z3" ] }, { "an" : [ "nn", "mn", "xn", "yn", "zn" ] } ]