我们有数据如下
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