CSVファイルの再構成

CSVファイルの再構成

変更するデータの例は次のとおりです。

John,,
bim,bam,boom
tim,tam,toom
lam,loom,lim
Mary,,
pam,pim,poom
dam,dim,doom*

私はこれを達成しようとしています。

John,bim,bam,boom
John,tim,tam,toom
John,lam,loom,lim
Mary,pam,pim,poom
Mary,dam,dim,doom

名前が行に単独で表示されると、次の名前が同じパターンで表示されるまで、その下のすべての行に対して新しい列になります。

awkや他のツールが役に立つかもしれません。しかし、少し恥ずかしいです。

条件を設定してみましたが(2列と3列が空であれば何かを行う)、今は少し複雑に見えます。

答え1

あなたの思考は正しいです:

条件を設定してみます(2列と3列が空の場合は何かをしてください)

具体的には、

  • 2列と3列が空の場合は、1列の値を保存して続行します。
  • それ以外の場合は、保存した値を行に追加して印刷します(awkこれにはいくつかの方法があります)。

例えば

awk -F, '$2=="" && $3=="" {pfx=$1; next} {print pfx "," $0}' file.csv

または、より慣用的にFSフィールド区切り変数を使用します。

awk -F, '$2=="" && $3=="" {pfx=$1; next} {$0 = pfx FS $0; print}' file.csv

または(基本操作 - ルールがtrueと評価されるか、1- レコードを印刷するため)

awk -F, '$2=="" && $3=="" {pfx=$1; next} {$0 = pfx FS $0} 1' file.csv
John,bim,bam,boom
John,tim,tam,toom
John,lam,loom,lim
Mary,pam,pim,poom
Mary,dam,dim,doom

答え2

パールの代替案:

$ perl -F',' -lane 'if(@F == 1){$prefix = sprintf("%s,",@F);next;};print $prefix . $_' input.csv
John,bim,bam,boom
John,tim,tam,toom
John,lam,loom,lim
Mary,pam,pim,poom
Mary,dam,dim,doom

この作業の前提は、as演算子を使用して各行を要素配列に分割し,、配列に項目が1つしかない場合は、その行を接頭辞として使用して次の行に移動することです。 1つの要素より長い他の行にはプレフィックスが追加されます。もちろん、配列の長さが1の場合にのみプレフィックスが変更されます。

shiftあるいは、Glenn Jackmanが提案したように短く説明すると、次のようになります。

$ perl -F',' -lane 'if(@F == 1){$prefix = shift @F;next;};print $prefix . "," . $_' input.csv       

または

$ perl -F, -lane '$,=","; if (1 == @F) {$name = shift @F} else {print $name, @F}' input.csv

関連情報