Если столбец 2 файла2 отличается от столбца 2 файла1, выведите столбец1 из файла1 и столбец2 из обоих файлов

Если ваш файл выглядит так:

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 будет иметь замененные записи. Это можно запрограммировать для перебора всех записей файла.

2
09.03.2018, 01:58
3 ответа

РЕДАКТИРОВАТЬ :Вопрос в первоначально написанном виде был довольно неясным и не содержал важных деталей. Ниже приведены два оригинальных ответа, которые я написал, когда вопрос стал более ясным. Ответы хороши для аналогичных более простых случаев на вопрос, как написано в настоящее время.

  1. В случае отсортированных и сопоставленных файлов я бы рекомендовал сначала использовать утилиту командной строки 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}'

  2. В случае несортированных сопоставленных файлов, если все ключи файла1 и файла2 идентичны, просто sortввод в paste. Вы можете делать такие вещи в оболочке bash, используя подстановку процесса с формой <( command ), как в примере ниже:

    вставить -d"," < (отсортировать файл1 )< (отсортировать файл2 )| awk 'BEGIN{FS=",";OFS=","}$2 != $4{printf "%s,%s,%s", $1, $2, $4}'

  3. Для несортированного и несовпадающего набора файлов (вопрос в том виде, в каком он написан ), см. ответ пользователя don _crissti.

0
27.01.2020, 23:09

Прочитать 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
0
27.01.2020, 23:09

Могу ли я использовать объединение?

sort -o file1 file1 
sort -o file2 file2 
join -t"," -1 1 -2 1 file1 file2 | awk '$2!=$3'
-1
27.01.2020, 23:09

Теги

Похожие вопросы