異なる列にカンマ区切り値を持つプロセステーブル

異なる列にカンマ区切り値を持つプロセステーブル

私は成功しなかったし、しばらく次のことを試しました。

私が受け取ったデータには、各個々の列にカンマ区切りの値があります。列 6 のコンマの前の最初の値は、常に列 7 のコンマの前の最初の値に関連付けられます。データを抽出し、次のように正しい順序でテーブルに入れたいと思います。

入力データ:

1 2 3 4 5 A1,A2 B1,B2
1 7 3 3 5 C1,C2,C3 D1,D2,D3
1 2 R 4 b E1,E2,E3,E4 G1,G2,G3,G4

出力データ:

1 2 3 4 5 A1 B1
1 2 3 4 5 A2 B2
1 7 3 3 5 C1 D1 
1 7 3 3 5 C2 D2
1 7 3 3 5 C3 D3
1 2 R 4 b E1 G1
1 2 R 4 b E2 G2
1 2 R 4 b E3 G3
1 2 R 4 b E4 G4

私はそれらをソートされた配列に入れる前に分離する必要があることを知っていますが\t、私はこれに完全に慣れておらず、膨大な量のデータを受け取ります。

答え1

そしてawk

awk '{split($6,a,","); split($7,b,","); for(i in a){print $1,$2,$3,$4,$5,a[i],b[i]}}' file
  • awk入力スペースまたはタブで区切って読みます。デフォルト値:[\t ]+
  • split($6,a,",")6番目のフィールドを$6コンマで区切り、,出力を名前付き配列に保存しますa
  • split($7,b,",")$77番目のフィールドをカンマで区切り、,出力を名前付き配列に保存しますb
  • for(i in a)今度は配列を繰り返しますa...
    • print ...,a[i],b[i]...そして、その値をそのインデックスと共に両方の配列値$1に印刷します。$5a[i]b[i]i

出力:

1 2 3 4 5 A1 B1
1 2 3 4 5 A2 B2
1 7 3 3 5 C1 D1
1 7 3 3 5 C2 D2
1 7 3 3 5 C3 D3
1 2 R 4 b E1 G1
1 2 R 4 b E2 G2
1 2 R 4 b E3 G3
1 2 R 4 b E4 G4

答え2

使用幸せ(以前のPerl_6)

~$ raku -ne 'my @split1 = .split(/ \s+ /); 
             my @split2 = @split1.[5..*].map: .split(","); 
             for [Z] @split2 { put (@split1[0..4], $_).join("\t") };'  file.txt

RakuはPerlファミリーのプログラミング言語です。CSV複雑なCSVファイル(複数行ヘッダー、挿入された改行など)を処理できるモジュールがあります。上記は外部モジュールをロードしていない答えです。

-neコードは、(非自動印刷、1行ずつ)フラグを介してファイルを1行ずつ読み取るように指示します。最初はsplitスペースを分離して配列を作成します@split1。 5つの「データ」列が各行の先頭に提供されるため、sを最後の「共変」列(今回はカンマで区切った)配列として生成する2番目の文では、インデックスは無視され[0..4]ます。mapsplit[5..*]@split1,@split2

プレフィックス[Z]Zip縮小演算子は、@split2配列内の各要素を削除して要素を効果的に転置します(和が隣接するようにA1B1。最後に、put「データ」列と「共変」列が並んでいる行が出て、join必要に応じて編集します。

入力例:

1 2 3 4 5 A1,A2 B1,B2
1 7 3 3 5 C1,C2,C3 D1,D2,D3
1 2 R 4 b E1,E2,E3,E4 G1,G2,G3,G4

出力例:

1 2 3 4 5   A1 B1
1 2 3 4 5   A2 B2
1 7 3 3 5   C1 D1
1 7 3 3 5   C2 D2
1 7 3 3 5   C3 D3
1 2 R 4 b   E1 G1
1 2 R 4 b   E2 G2
1 2 R 4 b   E3 G3
1 2 R 4 b   E4 G4

https://docs.raku.org/routine/split
https://docs.raku.org/言語/operators#Reduction_metaoperators
https://raku.org

関連情報