Как добавить пробел после запятой, если его нет в 6-м столбце файла csv?

Ubuntu 16.04
Баш 4.3.3

Мне также нужен способ добавить пробел после запятой, если его нет в 6-м столбце. Мне пришлось прокомментировать приведенную выше строку, потому что она ставила пробел после всех запятых в файле csv.

Неправильный:"This is 6th column,Hey guys,Red White & Blue,I know it,Right On"

Идеально:"This is 6th column, Hey guys, Red White & Blue, I know it, Right On"

Я почти мог видеть, как awk распечатывает 6-й столбец, а sed делает все остальное:

awk '{ print $6 }' "$feed " | sed -i 's/|/,/g; s/,/, /g; s/,\s\+/, /g'

Вот что у меня есть на данный момент:

for feed in *; do
   sed -r -i 's/([^,]{0,10})[^,]*/\1/5' "$feed"
   sed -i '
      s/<b>//g; s/*//g;
      s/\([0-9]\)""/\1inch/g;
#     s/|/,/g; s/,/, /g; s/,\s\+/, /g;
      s/"one","drive"/"onetext","drive"/;
      s/"comments"/"description"/;
      s/"features"/"optiontext"/;
    ' "$feed"
done

s/|/,/g; s/,/, /g; s/,\s\+/, /g; работает, но является глобальным, а не внутри столбца.

Вы хотите добавить пробел после запятой, если его нет? Запятая должна существовать, чтобы добавить после нее пробел. Как выглядит входной файл? Как это разделено? Пробелами, значит, awk может его разобрать? Каков ожидаемый результат? @edit och Я понял, вы хотите добавить пробел после запятой, если пробел не существует, сэр.

KamilCuk 09.09.2018 22:18

Почему не awk '{ print $6 }' "$feed " | sed 's/, */, /g'? Что делает |? А все остальные заменители?

Ljm Dullaart 09.09.2018 23:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
152
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Похоже, все, что вам нужно, это (используя GNU awk для FPAT):

awk 'BEGIN{FPAT = "[^,]*|\"[^\"]+\""; OFS = ","} {gsub(/, ?/,", ",$6)} 1'

например.:

$ cat file
1,2,3,4,5,"This is 6th column,Hey guys,Red White & Blue,I know it,Right On",7,8

$ awk 'BEGIN{FPAT = "[^,]*|\"[^\"]+\""; OFS = ","} {gsub(/, ?/,", ",$6)} 1' file
1,2,3,4,5,"This is 6th column, Hey guys, Red White & Blue, I know it, Right On",7,8

На самом деле похоже, что весь ваш сценарий оболочки, включая несколько вызовов GNU sed, можно было бы сделать гораздо более эффективно всего за один вызов GNU awk без необходимости в окружающем цикле оболочки, например (не проверено):

awk -i inplace '
BEGIN{FPAT = "[^,]*|\"[^\"]+\""; OFS = ","} 
{
    $0 = gensub(/([^,]{0,10})[^,]*/,"\\1",5)
    $0 = gensub(/([0-9])""/,"\\1inch","g")
    sub(/"one","drive"/,"\"onetext\",\"drive\"")
    sub(/"comments"/,"\"description\"")
    sub(/"features"/,"\"optiontext\"")
    gsub(/, ?/,", ",$6)
}
' *

но, если ввод содержит пустые поля, FPAT не сработает, верно?

oguz ismail 10.09.2018 07:13

@oguzismail. Нет. Первая часть FPAT допускает пустые поля.

kvantour 10.09.2018 11:06

@ed, это хорошо сработало с тем, что у вас есть. Собираюсь реализовать завтра.

Curious Sam 17.09.2018 03:42

Это может сработать для вас (GNU sed):

sed -r 's/[^,"]*("[^"]*")*/\n&\n/6;h;s/, ?/, /g;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/' file

Шестое поле окружите символами новой строки. Сделайте копию строки. Замените все запятые, за которыми следует возможный пробел, на запятую, за которой следует пробел. Добавьте исходную строку и, используя сопоставление с образцом, замените измененное поле, удалив остальную часть улучшенной строки.

Другие вопросы по теме