私は成功しなかったし、しばらく次のことを試しました。
私が受け取ったデータには、各個々の列にカンマ区切りの値があります。列 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,",")
$7
7番目のフィールドをカンマで区切り、,
出力を名前付き配列に保存しますb
。for(i in a)
今度は配列を繰り返しますa
...print ...,a[i],b[i]
...そして、その値をそのインデックスと共に両方の配列値$1
に印刷します。$5
a[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]
ます。map
split
[5..*]
@split1
,
@split2
プレフィックス[Z]
Zip縮小演算子は、@split2
配列内の各要素を削除して要素を効果的に転置します(和が隣接するようにA1
)B1
。最後に、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