Если ваш файл выглядит так:
abcd 1234
djhd 6534
fytf 4544
Вы можете выполнить однострочное выполнение AWK как это
index=2;for i in `cat filename`; do echo $i; done|awk -v OFS=" " -v \
INDEX=$index '$1 ~ /^abcd$/ {$2="1233"; print }' >> NewFile.txt
Это будет соответствовать имени dddd
и заменить 1234
на 1233
. Результат будет перенаправлен в новый файл с именем NewFile.txt
.
Итак, ваш NewFile будет иметь замененные записи. Это можно запрограммировать для перебора всех записей файла.
РЕДАКТИРОВАТЬ :Вопрос в первоначально написанном виде был довольно неясным и не содержал важных деталей. Ниже приведены два оригинальных ответа, которые я написал, когда вопрос стал более ясным. Ответы хороши для аналогичных более простых случаев на вопрос, как написано в настоящее время.
В случае отсортированных и сопоставленных файлов я бы рекомендовал сначала использовать утилиту командной строки paste
для создания временного третьего файла, который будет файлом со вторым столбцом второго файла, добавленным к каждой строке. Направьте вывод этой команды paste
в awk
, и тогда ваше решение awk
станет тривиальным-$2 != $4{printf "%s %s %s", $1, $2, $4}
.
вставить -d"," файл1 файл2 | awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s", $1, $2, $4}'
В случае несортированных сопоставленных файлов, если все ключи файла1 и файла2 идентичны, просто sort
ввод в paste
. Вы можете делать такие вещи в оболочке bash
, используя подстановку процесса с формой <( command )
, как в примере ниже:
вставить -d"," < (отсортировать файл1 )< (отсортировать файл2 )| awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s", $1, $2, $4}'
Для несортированного и несовпадающего набора файлов (вопрос в том виде, в каком он написан ), см. ответ пользователя don _crissti.
Прочитать 2-й файл, сохранить содержимое в массив (ключ = 1-е поле,значение = 2-е поле ), затем прочитайте 1-й файл и проверьте, является ли 1-е поле общим ключом и отличается ли соответствующее 2-е поле. Если результат положительный, выведите ключ и два значения:
awk 'BEGIN{FS=OFS=","}NR==FNR{z[$1]=$2;next}
{if (z[$1] && (z[$1]!=$2)){print $0, z[$1]}}' file2 file1
Могу ли я использовать объединение?
sort -o file1 file1
sort -o file2 file2
join -t"," -1 1 -2 1 file1 file2 | awk '$2!=$3'