У меня есть файл CSV в этом формате
a,b,c,d,e,f,no disk detected
a,b,c,d,e,f,disk run into error
a,b,c,d,e,f,no memory in the server
a,b,c,d,e,f,memory has correctable errors
в последнем столбце мне нужно найти слово
диск и замените его ошибкой диска память и заменить ее ошибкой памяти Эту часть я уже понял
cat filename.csv |awk -F "," '{print $NF}' |sed 's/^.*disk.*$/disk error/' |sed 's/^.*memory.*$/memory error/'
Теперь часть, в которой мне нужна помощь, когда sed заменяет эту строку, можно ли записать в тот же файл (имя файла.csv) или создать новый файл со всеми столбцами + обновленный столбец, поэтому новый файл будет выглядеть так
a,b,c,d,e,f,disk error
a,b,c,d,e,f,disk error
a,b,c,d,e,f,memory error
a,b,c,d,e,f,memory error





Это проще сделать с sed:
sed -E 's/^(.+,).*(disk|memory).*$/\1\2 error/' file.csv
a,b,c,d,e,f,disk error
a,b,c,d,e,f,disk error
a,b,c,d,e,f,memory error
a,b,c,d,e,f,memory error
Чтобы внести изменения в один и тот же файл, используйте:
sed -i.bak -E 's/^(.+,).*(disk|memory).*$/\1\2 error/' file.csv
== Подробности ==
Регулярное выражение поиска:
^: Старт(.+,): Жадный матч до последней запятой и зафиксируйте ее в группе №1.*(disk|memory): Сопоставьте 0 или более символов перед сопоставлением disk или memory и зафиксируйте его в группе № 2..*$: Сопоставьте 0 или более символов до концаШаблон замены:
\1: обратная ссылка на группу №1 для размещения текста до последней запятой.\2 error: добавить disk error или memory errorawk решение:
awk -F, '{if ($NF~/disk/) $NF = "disk error"; if ($NF~/memory/) $NF = "memory error";}1' OFS=, file
В GNU awk v4.1.0+ вы можете добавить переключатель -i inplace, чтобы заменить file на месте.
В противном случае попробуйте awk .... file | tee file.
Таким образом, сама приведенная выше команда не требует GNU awk, но если у вас есть GNU awk, вы можете сделать это более кратким способом:
awk -F, '{match($NF,"(disk|memory)",m);$NF=m[1] " error";}1' OFS=, file
NF означает номер столбца, $NF означает последний столбец.-F, установите разделитель полей FS на запятую.OFS=, установите разделитель полей outout на запятую.
@ClaesWikner Да, это можно спасти. Спасибо, что упомянули об этом. Я добавил это сюда, чтобы иметь какой-то закрытие, просто полегчало :)
Мы можем обойтись без самой последней точки с запятой.