Unix: сплит линия с разделителем - PullRequest
1 голос
/ 28 июня 2019

У меня есть файл, подобный этому

a   b   c,d
e   f   g
x   y   r,s,t

, и я хотел бы разделить столбец, используя "," в качестве разделителя.Остальные столбцы должны быть скопированы.

Ожидаемый результат:

a   b   c
a   b   d
e   f   g
x   y   r  
x   y   s
x   y   t

Спасибо

1 Ответ

0 голосов
/ 28 июня 2019

Использование 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
...