我们可以在 Linux 中运行一个数据透视表将 1 条记录转换为多条记录吗

我们可以在 Linux 中运行一个数据透视表将 1 条记录转换为多条记录吗

我们有数据如下

 ABC|RAM|BANGALORE|100,200,300

我们可以运行任何数据透视/循环将以上数据分为多个记录吗

ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300

根据最后一列带有逗号分隔符的多个值,应创建记录数

我们可以在 linux shell 中做些什么吗?

答案1

我不会为此使用 shell 本身。

另一个 awk 实现

$ awk 'BEGIN{OFS=FS="|"} {split($NF,a,","); for(i in a) {$NF = a[i]; print}}' data
 ABC|RAM|BANGALORE|100
 ABC|RAM|BANGALORE|200
 ABC|RAM|BANGALORE|300

或与磨坊主

$ mlr --nidx --fs '|' nest --explode --values --across-records --nested-fs ',' -f 4 data
 ABC|RAM|BANGALORE|100
 ABC|RAM|BANGALORE|200
 ABC|RAM|BANGALORE|300

或者更紧凑

mlr --nidx --fs '|' nest --evar ',' -f 4 data

如果你真的需要使用 shell,然后使用最近的 bash:

#!/bin/bash

while IFS='|' read -a fields; do 
  IFS=',' read -a vals <<<"${fields[ -1]}"
  unset 'fields[ -1]'
  for v in "${vals[@]}"; do
    printf '%s|' "${fields[@]}" 
    printf '%s\n' "$v"
  done 
done < data

答案2

使用 awk:

awk -F "," '                      #Sets field separator to ,
    NF<2{print;next}
    {
        print $1                  #Print first line up to ,
        sub(/[^|]*$/,"",$1)       #Remove all that is after | in $1
        for(i=2;i<=NF;i++){       #Print each remaining field after the first field
            printf "%s%s\n",$1,$i
        }
    }
' file

样本文件:

ABC|RAM|BANGALORE|100,200,300
ABC|BA00|
ABC|RAM|BANGALO00|200,300

输出:

ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300
ABC|BA00|
ABC|RAM|BANGALO00|200
ABC|RAM|BANGALO00|300

答案3

例如:

#!/usr/bin/env sh

s="ABC|RAM|BANGALORE|100,200,300"

header="$(echo "$s" | rev | cut -d'|' -f2- | rev)"

list="$(echo "$s" | rev | cut -d'|' -f1 | rev)"

IFS=','
for i in $list
do
    printf "%s|" "$header"
    printf "%s\n" "$i"
done

输出:

ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300

相关内容