Используйте sed для замены значений в столбце csv, если условие выполняется в другом столбце.

У меня есть файл CSV, состоящий из нескольких полей, разделенных запятыми.

id,name,nationality,sex,date_of_birth,height,weight,sport,gold,silver,bronze,info
736041664,A Jesus Garcia,ESP,male,1969-10-17,1.72,64,athletics,0,0,0,

Мне нужно изменить со строчных на прописные значения в столбце «имя», когда столбец «спорт» — это стрельба или дзюдо. Я могу использовать только sed. Я использую эту команду

sed 's/\(.*\),\(.*\),\(.*\),\(.*\),\(.*\),\(.*\),\(.*\),\(.*\),\(.*\),\(.*\),\(.*\),\(.*\)/\1,\U\2\E,\3,\4,\5,\6,\7,\shooting|judo,\9,\10,\11,\12/' athletesv2.csv

Но это не работает, так как просто показывает "стрельба | дзюдо" во всех строках.

Как я могу сделать эти замены?

Обратите внимание, что на выходе должен быть файл .sed, который нужно вызывать с помощью sed -f script.sed athletes.csv

На выходе мне нужно сохранить заголовок.

Я использую Ubuntu Linux.

Стандартный sed не поддерживает преобразование регистра. На какой платформе и/или версии sed это должно работать?

tripleee 09.04.2022 18:57

В Ubuntu мне удалось выполнить преобразование регистра, чего мне не хватает, так это установки условия в сценарии sed.

Isabel Lopez 09.04.2022 19:03
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
36
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы можете использовать GNU sed, вы можете использовать

rx='^([^,]*),([^,]*),([^,]*,[^,]*,[^,]*,[^,]*,[^,]*,(shooting|judo),[^,]*,[^,]*,[^,]*,[^,]*)$'
repl='\1,\U\2\E,\3'
sed -E "s/$rx/$repl/" athletes.csv

См. онлайн демо:

#!/bin/bash
rx='^([^,]*),([^,]*),([^,]*,[^,]*,[^,]*,[^,]*,[^,]*,(shooting|judo),[^,]*,[^,]*,[^,]*,[^,]*)$'
repl='\1,\U\2\E,\3'

s='id,name,nationality,sex,date_of_birth,height,weight,sport,gold,silver,bronze,info
736041664,A Jesus Garcia,ESP,male,1969-10-17,1.72,64,athletics,0,0,0,
132041664,A Jesus Garcia,ESP,male,1969-10-17,1.72,64,shooting,0,0,0,'

sed -E "s/$rx/$repl/" <<< "$s"

Выход:

id,name,nationality,sex,date_of_birth,height,weight,sport,gold,silver,bronze,info
736041664,A Jesus Garcia,ESP,male,1969-10-17,1.72,64,athletics,0,0,0,
132041664,A JESUS GARCIA,ESP,male,1969-10-17,1.72,64,shooting,0,0,0,

Примечания:

  • ^([^,]*),([^,]*),([^,]*,[^,]*,[^,]*,[^,]*,[^,]*,(shooting|judo),[^,]*,[^,]*,[^,]*,[^,]*)$ — это шаблон, который соответствует целой строке (^ — это начало строки, а $ — конец строки), который захватывает поля 1 и 2 в отдельные группы, а остальную часть строки — в группу 3. Шаблон поля 8 жестко закодирован , (shooting|judo) либо соответствует shooting, либо judo.
  • \U\2\E при замене вернет значение группы 2 в верхний регистр.

Обратите внимание, у вас нельзя использовать более \9 обратной ссылки в sed, поэтому вам нужно уменьшить их количество и сгруппировать те группы, которые не используются.

Спасибо Виктор. Он работает отлично! Однако мне нужно создать сценарий sed, его нужно запустить как sed -f script3.sed sports.csv. в этом сценарии sed мне нужно добавить дополнительные условия, например: s/ESP/Spain/ps/DEN/Denmark/p ...

Isabel Lopez 09.04.2022 18:48

Затем сохраните скрипт в файл. Можно ли ставить #!/usr/bin/sed -Ef в шебанг?

tripleee 09.04.2022 19:14

Если вам не разрешено использовать sed -E, вам в основном придется использовать обратную косую черту в скобках и |, как в исходном коде.

tripleee 09.04.2022 19:16

Нет указаний на то, что я не могу использовать sed -E, я попробую так. Большое спасибо

Isabel Lopez 09.04.2022 19:46
Ответ принят как подходящий

Использование sed

$ sed '/^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,shooting\|judo,/s/,[^,]*/\U&/' input_file
id,name,nationality,sex,date_of_birth,height,weight,sport,gold,silver,bronze,info
736041664,A JESUS GARCIA,ESP,male,1969-10-17,1.72,64,shooting,0,0,0,

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

sed -E 'h;x;s/[^,]*/\n&\n/8;/\n(shooting|judo)\n/{x;s/[^,]*/\U&/2;x};x' file

Сделать копию текущей строки.

Окружите копию восьмого поля символом новой строки, и если это поле содержит либо shooting, либо judo, заглавные буквы второго поля в чистой версии.

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