>我有这个文件:
head test1.txt
id,name,position
123,James Marino,a
124,Charles Smith,a|b
125,Jennifer Pits,b|c|g
126,Daniel Earth,a|g
我想使用一些UNIX命令(例如awk,sed或grep)来更改它:
id,name,position
123,James Marino,a
124,Charles Smith,a
124,Charles Smith,b
125,Jennifer Pits,b
125,Jennifer Pits,c
125,Jennifer Pits,g
126,Daniel Earth,a
126,Daniel Earth,g
有人知道这样做的有效方法吗?
awk
救援!
$ awk -F, -v OFS=, '{n=split($NF,a,"|");
for(i=1;i<=n;i++) {$NF=a[i]; print}}' file
id,name,position
123,James Marino,a
124,Charles Smith,a
124,Charles Smith,b
125,Jennifer Pits,b
125,Jennifer Pits,c
125,Jennifer Pits,g
126,Daniel Earth,a
126,Daniel Earth,g
这可能对你有用(GNU sed):
sed -r 's/((.*,)[^|]*)|/1n2/;P;D' file
这会将行复制到第一个|
,并在当前行前面加上后续换行符。当前行删除了第一个|
前面的字符及其|
。打印并删除第一行,并重复该过程,直到所有|
都被计算在内。
一个纯粹的 Bash 解决方案:
file=test1.dat
while IFS= read -r line || [[ -n $line ]] ; do
IFS=, read -r num name values_str <<<"$line"
IFS='|' read -r -a values <<<"$values_str"
# Handle empty values field (otherwise the row will not be printed)
[[ ${#values[@]} == 0 ]] && values=( '' )
for val in "${values[@]}" ; do
printf '%s,%s,%sn' "$num" "$name" "$val"
done
done <"$file"