Заменить n-е поле CSV, где первое поле соответствует строке Bash

#bash #csv #replace #sed

#bash #csv #заменить #sed

Вопрос:

Я пытаюсь заменить содержимое поля csv на основе первого. Я попробовал что-то с sed — найдено в другом потоке — но я не могу получить правильный результат.

Пример :

 57c5b4da8ef722a0d4b0bbd9727982d2;510;1020;20130410
4858ecf7bf221fd8a3792615d8008dd8;530;4050;20130412
  

Я хочу иметь возможность заменять содержимое поля на основе его номера и где первое поле содержит «57c5b4da8ef722a0d4b0bbd9727982d2».

Моя текущая строка sed работает только для последнего поля :

 sed -i 's/(57c5b4da8ef722a0d4b0bbd9727982d2)(;.*;).*/1220130401/' myfile
  

Комментарии:

1. Пожалуйста, четко объясните вопрос. Если возможно, опубликуйте ожидаемый результат.

Ответ №1:

Я думаю, вы пытаетесь заменить третье и последнее поле (если ; это разделитель) на число 20130401 ,

 $ sed 's/^(57c5b4da8ef722a0d4b0bbd9727982d2)(;[^;]*;).*$/1220130401/g' file
57c5b4da8ef722a0d4b0bbd9727982d2;510;20130401
4858ecf7bf221fd8a3792615d8008dd8;530;4050;20130412
  

Ответ №2:

Может ли это быть нормально?

 awk -F; '$1=="57c5b4da8ef722a0d4b0bbd9727982d2" {$NF=220130401}1' OFS=; file
57c5b4da8ef722a0d4b0bbd9727982d2;510;1020;220130401
4858ecf7bf221fd8a3792615d8008dd8;530;4050;20130412
  

Если первое поле 57c5b4da8ef722a0d4b0bbd9727982d2 заменить последнее поле на 220130401

Ответ №3:

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

 sed 's/[^;]*/xxx/2' file
  

Это заменяет второе поле на xxx .

Если вам нужно второе поле определенной строки, используйте:

 sed '/57c5b4da8ef722a0d4b0bbd9727982d2/s/[^;]*/2' file