У меня есть файл 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
Да, после Value-Old1 будет место
Если вы не возражаете против потери некоторых пробелов в выводе, вы можете использовать некоторые 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
. Работает ли он для обоих линии, когда вы тестируете?Я начинаю думать, что у меня есть локальная проблема, которая помешала мне добраться туда.
@DavePritlove У меня это работает в Linux и macOS, но у меня возникла эта проблема при написании кода. Ты забыл $0 = $0
? это инструкция, которая гарантирует правильное разделение полей после изменения FS
Благодарю. На самом деле я использовал $1 = $ 1, чтобы принудительно сбросить разделитель полей, но просто попытался с $ 0 = $ 0 и все равно получил старое значение для обеих строк. В вашем сообщении, вставленном дословно, я получаю старое значение в строке 1, но измененное значение в строке 2. (Терминал на Mac). Очень странный. Я собираюсь перезагрузиться, скрестив пальцы.
Очень странно, у меня до сих пор такой же глюк. Я мог бы оставить это до завтра, чтобы выяснить, что я делаю неправильно, так как здесь уже поздно.
@DavePritlove Вы должны добавить print NF
для проверки правильности разделения, ваши входные файлы могут иметь неожиданные символы, такие как CRLF или HT.
@Fravadona: Ваше решение сработало, хотя в начале оно удалило пустые места. Теперь я пытаюсь. вывести эти данные в другой файл в качестве вывода. Спасибо за ваше драгоценное время и усилия, чтобы помочь мне
Что вы пробовали? В основном вам придется перебирать позиции во втором файле в поисках поля, равного одному из ключей.