Как переместить последнее значение [0-9] {1,9} строки в последнюю строку (.csv) с помощью bash - PullRequest
0 голосов
/ 17 января 2020

пример .csv:

"something","31","null","null","null","null",
"something","something","something","142","null","null",
"something","something","24","null","null","null",

Я sh чтобы получить такой результат:

"something","null","null","null","null","31",
"something","something","something","null","null","142",
"something","something","null","null","null","24",

Как переместить последний [0-9] {1,9 } числовое значение с bash -скриптом в последнюю ячейку (если в ячейках есть только нулевые значения после)?

Я пытался сделать это с помощью sed, но безуспешно.

Ответы [ 2 ]

1 голос
/ 17 января 2020

Вот мой вариант в bash с объяснением

raw=( $(cat file) )         # load data to raw array
for item in "${raw[@]}"; {  # loop through raw data
    search=${item//[!0-9]/} # this will give only digits
    # if match found remove it from string by change ,"123", to a comma and paste to the end
    [[ $search ]] && item="${item//,\"$search\",/,}\"$search\"," 
    echo $item # print result
}
1 голос
/ 17 января 2020

Этот короткий скрипт awk работает для данного примера:

awk -F',' -v OFS=',' -v pat='^"[0-9]+"$' '{
for(i=NF;i>0;i--)if($i~ pat ){$NF=$i FS;$i="\x98";break}
    sub("\x98,","")
}7' file

краткое объяснение:

Это интересная проблема.

  • the pat переменная хранит шаблон регулярного выражения, который мы хотим переместить в конец
  • для каждой строки, мы делаем al oop от конца и проверяем шаблон, чтобы мы могли убедиться, что мы нашли последний соответствующий столбец.
  • если мы нашли столбец, мы устанавливаем последнее поле с соответствующим столбцом с запятой. (Я заметил, у вас всегда есть пустое поле в конце каждой строки). И мы устанавливаем значение col с невидимым значением \x98, чтобы потом можно было легко его удалить.
  • наконец, мы удаляем "\x98," с помощью sub()

тест

kent$  cat f
"something","31","null","null","null","null",
"something","something","something","142","null","null",
"something","something","24","null","null","null",

kent$  awk -F',' -v OFS=',' -v pat='^"[0-9]+"$' '{
for(i=NF;i>0;i--)if($i~ pat ){$NF=$i FS;$i="\x98";break}
        sub("\x98,","")
}7' f 
"something","null","null","null","null","31",
"something","something","something","null","null","142",
"something","something","null","null","null","24",
...