Найдите строку и измените ее в CSV-файле с учетом ввода - PullRequest
0 голосов
/ 18 марта 2019

У меня есть CSV-файл со списком работников, и я хочу создать скрипт для изменения их рабочей группы с учетом их идентификаторов.Строки в CSV-файлах выглядят следующим образом:

До :

ID           TAG GROUP
niub16677500;B00;AB0

После :

ID           TAG GROUP
niub16677500;B00;BC0

Как яможет сделать это?Я работаю с командами awk и sed, но пока ничего не могу получить.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

С awk:

awk -F';' -v OFS=';' -v id="niub16677500" -v new_group="BC0" '{if($1==id)$3=new_group}1' input.csv
ID;TAG;GROUP
niub16677500;B00;BC0

Перенаправьте вывод в файл и обратите внимание, что заголовок csv должен использовать тот же разделитель полей, что и тело.

Пояснения

  • -F';' чтобы иметь разделитель входного поля как ;
  • -v OFS=';' то же самое для выхода FS
  • -v id="niub16677500" -v new_group="BC0" определяет переменные, которые вы собираетесь использовать в командах awk
  • '{if($1==id)$3=new_group}1', когда первый столбец равен значению, содержащемуся в переменной id, перезаписать 3-е поле и вывести строку

С sed:

id="niub16677500"; new_group="BC0"; sed "/^$id/s/;[^;]*$/;$new_group/" input.csv 
ID;TAG;GROUP
niub16677500;B00;BC0

Вы можете сделать внутреннее изменение, используя опцию -i.bak, или перенаправить вывод в файл.

Пояснения

  • Сохранить значения в 2 переменных
  • /^$id/ когда вы достигнете строки, которая начинается с хранилища идентификаторов в переменной id, запустите поиск sed и замените
  • s/;[^;]*$/;$new_group/ команда поиска и замены, которая заменит последнее поле новым значением
0 голосов
/ 18 марта 2019

Сед может это сделать,

echo 'niub16677500;B00;AB0' | sed 's/\(^niub16677500;...;\)\(...\)$/\1BC0/'

заменит группу AB0 в вашем примере на BC0, сопоставив имя пользователя, точку с запятой, любые 3 символа и другую точку с запятой, а затем сопоставив оставшиеся 3 символа. Затем в качестве вывода он повторяет первое совпадение с \ 1 и добавляет BC0.

Вы можете использовать:

sed 's/\(^niub16677500;...;\)\(...\)$/\1BC0/' <old_file >new_file

чтобы создать новый_файл с этим изменением.

https://www.grymoire.com/Unix/Sed.html - отличный ресурс, на него стоит взглянуть.

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