Замена значения поиска в текстовом файле

У меня есть файл CSV (File1) с парой Key, Value

Key1,Value1
Key2,Value2

У меня есть второй файл (File2), который не является структурированными данными, где у меня есть ключевые данные (Key1, Key2..etc). Мне нужно будет найти ключевые данные, за которыми следует константа (A) в приведенном ниже примере, а затем значение, которое нужно заменить.

Содержимое File2 перед заменой

Dummy1  Key1 A Value-Old1 BB C
D2 D3  4   Key2 A Value-Old2 BB C

Содержимое File2 После замены

Dummy1  Key1 A Value1 BB C
D2 D3  4   Key2 A Value2 BB C

Любые входные данные высоко ценятся, достигая этого через awk или sed

Я перешел по этой ссылке, чтобы получить какое-то место, но мой файл замены является неструктурированным, а не файлом CSV, как показано ниже. https://unix.stackexchange.com/questions/126485/replacing-the-values-in-one-file-with-the-values-in-other-file-in-bash

Что вы пробовали? В основном вам придется перебирать позиции во втором файле в поисках поля, равного одному из ключей.

tripleee 09.11.2022 20:23

Да, после Value-Old1 будет место

newbie_learn 09.11.2022 20:32
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы не возражаете против потери некоторых пробелов в выводе, вы можете использовать некоторые awk:

awk -F ',' '
    NR == FNR { arr[$1] = $2; next }
    FNR == 1 { FS = " "; $0 = $0 }
    {
        for (i = 1; i <= NF-2; i++)
            if ($i in arr && $(i+1) == "A") {
                $(i+2) = arr[$i]
                break
            }
    }
    1
' file1.csv file2.txt

В целом это подход, который я пробовал (я проверил {if ($i= = "A" && ($(i-1) in a)) и условно установил $(i+1)=a[(i-1)];, но он не возвращал правильный результат. Когда я запускаю ваш фрагмент, он работает для строки 2, но строка 1 остается Dummy1 Key1 A Value-Old1 BB C. Работает ли он для обоих линии, когда вы тестируете?Я начинаю думать, что у меня есть локальная проблема, которая помешала мне добраться туда.

Dave Pritlove 10.11.2022 00:56

@DavePritlove У меня это работает в Linux и macOS, но у меня возникла эта проблема при написании кода. Ты забыл $0 = $0? это инструкция, которая гарантирует правильное разделение полей после изменения FS

Fravadona 10.11.2022 01:03

Благодарю. На самом деле я использовал $1 = $ 1, чтобы принудительно сбросить разделитель полей, но просто попытался с $ 0 = $ 0 и все равно получил старое значение для обеих строк. В вашем сообщении, вставленном дословно, я получаю старое значение в строке 1, но измененное значение в строке 2. (Терминал на Mac). Очень странный. Я собираюсь перезагрузиться, скрестив пальцы.

Dave Pritlove 10.11.2022 01:08

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

Dave Pritlove 10.11.2022 01:16

@DavePritlove Вы должны добавить print NF для проверки правильности разделения, ваши входные файлы могут иметь неожиданные символы, такие как CRLF или HT.

Fravadona 10.11.2022 17:58

@Fravadona: Ваше решение сработало, хотя в начале оно удалило пустые места. Теперь я пытаюсь. вывести эти данные в другой файл в качестве вывода. Спасибо за ваше драгоценное время и усилия, чтобы помочь мне

newbie_learn 10.11.2022 20:38

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