Использование awk. Ожидается, что разделители полей будут пробелом или табуляцией:
$ awk '{
split($3,a,",") # split the third field on commas, hash to a
for(i in a) { # for all entries in a
sub(/[^ \t]+$/,a[i],$0) # replace last field with entries in a...
print # ... preserving separators, space or tab
}
}' file
a b c
a b d
e f g
x y r
x y s
x y t
Из-за использования sub()
он выдаст ложные результаты, если в $3
есть &
. Кроме того, как упоминалось в комментариях, использование for(i in a)
может привести к выводу записей в случайном порядке. Если это проблема, используйте:
$ awk '{
n=split($3,a,",") # store element count to n
for(i=1;i<=n;i++) { # iterate in order
sub(/[^ \t]+$/,a[i],$0)
print
}
}' file
Для файлов, разделенных табуляцией:
$ awk '
BEGIN { OFS="\t" } # output field separator
{
n=split($3,a,",")
for(i=1;i<=n;i++) {
$3=a[i] # & friendly version
print
}
}' file