複数の列を作成するのに助けが必要です。

複数の列を作成するのに助けが必要です。

データを複数の列に変換する必要があります。入力データ:

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

mlrfileスペースで区切られたデータの最初のフィールドが「キー」で、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出力されます。putkv

入力例:

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" ] } ]

https://docs.raku.org/言語/hashmap
https://raku.org

関連情報