невозможно выполнить поиск в file1 и заменить в file2 с помощью sed и xargs для всех строк - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно найти каждую строку в file1, а затем заменить эту строку в file2 строкой

file1

node1
node2

file2

node1
node2
node3
node4
cat ~/backup/file1.log | xargs -l1 -- sh -c 'sed -i "s/$1/done/g" ~/backup/file2.log' -- > ~/backup/file3.log

ожидаемый выходной файл 3

done
done
node3
node4

фактический результат

prints nothing in file3

1 Ответ

1 голос
/ 06 мая 2020

Зачем использовать запутанный sed / xargs l oop, если все это можно сделать в awk? Хуже всего ваша команда выполняет ввод-вывод нового файла для каждой новой записи в первом файле.

awk 'FNR == NR { lines[$1]; next } $1 in lines { $0 = "done" }1' f1 f2 > f3

Команда awk работает, помеча все строки в первом файле в массив lines а затем при поиске второй файл $1 in lines будет соответствовать тем строкам во втором файле, содержимое строк которых хешируется в массиве lines. В таком случае измените текущую строку на "done" и напечатайте ее {..}1 или по умолчанию распечатайте строки для несовпадающих строк.

$1 in line можно заменить на $0 in line, пока вы сопоставление содержимого обоих файлов по «всей» строке. Для соответствия c позиции столбца укажите фактический столбец.

...