2016-03-01 46 views
1

擴大細胞我有本文件:超過1個值到行使用bash

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 

有人知道這樣做的有效方法嗎?

回答

4

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 
2

這可能爲你工作(GNU SED):

sed -r 's/((.*,)[^|]*)\|/\1\n\2/;P;D' file 

這會將線高達第一|並預先考慮到了以下新行的當前行。當前行的字符在第一個|之前已被刪除,其|被刪除。第一行被打印並刪除,重複該過程直到所有|都被計入。

+0

妖獸。大致相當於perl:'perl -F,-ape'if(/^(.+,)/){$ prefix = $ 1; S/[|]/\ n $的前綴/克}'' –

1

純擊溶液:

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,%s\n' "$num" "$name" "$val" 
    done 
done <"$file"