変更するデータの例は次のとおりです。
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