Как заменить подстроки в столбце файла на строки из другого файла, используя awk? - PullRequest
1 голос
/ 29 апреля 2019

Я получил два файла и хочу использовать awk для замены подстроки в одном столбце файла на строку в другом файле

f1:
1a1 aaa 777
3_3 ccc 6b6
3.3 ddd 666

f2:
b5g9aaa8y
5_6ccc9.

output:
1a1 b5g9aaa8y 777
3_3 5_6ccc9. 6b6

Я думаю, что могу сделать это в два этапа:

  1. сделать пересечение dict FILE из подстроки и строки
  2. использовать awk (sub) для его завершения

Однако есть ли команда awk в одну строку для проверки, если подстрокав строке, а затем сделать замену?

#

Извините, я должен был объяснить это более четко.

  1. Формат строки и длина в файле2 не являются фиксированными.
  2. file1 и file2 не имеют одинаковое количество записей.file2 является подмножеством file1, нужно только вывести строку в file2
  3. при условии, что нет множественных попаданий

1 Ответ

4 голосов
/ 29 апреля 2019

РЕДАКТИРОВАТЬ2: Так как OP изменил образцы и добавил полные условия теперь, поэтому добавление этого решения.

awk 'FNR==NR{a[$2]=$1;b[$2]=$3;next} {for(i in a){if(index($0,i)){print a[i],$0,b[i];delete a[i];break}}}'  Input_file1   Input_file2

ИЛИ добавление не-однотипной формы решения.

awk '
FNR==NR{
  a[$2]=$1
  b[$2]=$3
  next
}
{
  for(i in a){
    if(index($0,i)){
      print a[i],$0,b[i]
      delete a[i]
      break;
    }
  }
}'  Input_file1  Input_file2


РЕДАКТИРОВАТЬ: В соответствии с комментарием @sjsam диапазон значений для substr может отличаться, тогда как в случае выборок можно также попробовать выполнить следующее. Он считает, что вы хотите иметь только алфавиты в качестве индекса и удалить все из строки Input_file2 (что OP также подтверждено в комментариях).

awk 'FNR==NR{val=$0;gsub(/[^[a-zA-Z]]*/,"");a[$0]=val;next} {$2=$2 in a?a[$2]:$2} 1'  Input_file2   Input_file1


Не могли бы вы попробовать следующее.

awk 'FNR==NR{a[substr($0,3,3)]=$0;next} {$2=$2 in a?a[$2]:$2} 1' Input_file2   Input_file1

Вывод будет следующим.

111 33aaa8 777
333 56ccc9 666
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...