Обработка текста - разделить первый столбец на два столбца на основе символа - PullRequest
0 голосов
/ 04 июня 2019

Разделить первый столбец в файле на два столбца на основе символа. Данные внутри скобок () следует переместить в новый столбец, удалив скобки.

Данный CSV-файл:

Col1(col2),col3,col4,col5
a(23),12,test(1),test2
b(30),15,test1(2),test3

Ожидаемый файл:

Col1,col2,col3,col4,col5
a,23,12,test(1),test2
b,30,15,test1(2),test3

Я попробовал приведенный ниже код. Я не могу извлечь данные из скобок, и это происходит при каждом появлении "()".

awk -F"(" '$1=$1' OFS="," filename

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

Выберите:

$ sed 's/(\([^)]*\))/,\1/' file
Col1,col2,col3,col4,col5
a,23,12,test(1),test2
b,30,15,test1(2),test3

$ sed 's/(/,/; s/)//' file
Col1,col2,col3,col4,col5
a,23,12,test(1),test2
b,30,15,test1(2),test3

.

$ awk '{sub(/\(/,","); sub(/\)/,"")} 1' file
Col1,col2,col3,col4,col5
a,23,12,test(1),test2
b,30,15,test1(2),test3

$ awk 'match($0,/\([^)]*\)/){$0= substr($0,1,RSTART-1) "," substr($0,RSTART+1,RLENGTH-2) substr($0,RSTART+RLENGTH) } 1' file
Col1,col2,col3,col4,col5
a,23,12,test(1),test2
b,30,15,test1(2),test3

$ awk 'BEGIN{FS=OFS=","} split($1,a,/[()]/) > 1{$1=a[1] "," a[2]} 1' file
Col1,col2,col3,col4,col5
a,23,12,test(1),test2
b,30,15,test1(2),test3

$ gawk '{$0=gensub(/\(([^)]*)\)/,",\\1",1)} 1' file
Col1,col2,col3,col4,col5
a,23,12,test(1),test2
b,30,15,test1(2),test3

$ gawk 'match($0,/([^(]*)\(([^)]*)\)(.*)/,a){$0=a[1] "," a[2] a[3]} 1' file
Col1,col2,col3,col4,col5
a,23,12,test(1),test2
b,30,15,test1(2),test3

Последние 2 требуют GNU awk для gensub () и 3-го аргумента для match () соответственно. Есть и альтернативы.

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

Не могли бы вы попробовать еще 1 sed решение, которое может вам помочь.

sed 's/\([^(]*\)(\([^)]*\))\(.*\)/\1,\2\3/'  Input_file
0 голосов
/ 04 июня 2019

Для полноты ...

оболочка posix

while IFS= read -r line; do
    car=${line%%)*}
    caar=${car%%(*}
    cdar=${car##*(}
    cdr=${line#*)}
    printf '%s\n' "$caar,$cdar$cdr"
done < file

Не думаю, что вы можете решить, используя только cut.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...