awk частичное совпадение для добавления текста в файл

#awk

#awk

Вопрос:

В приведенном awk ниже я пытаюсь cp и paste / или обновлять каждую соответствующую строку f2 в $3 f1 , если $2 f1 где-то есть в строке f2 . Всегда будет совпадение (обычно более 1), и мои фактические данные намного больше (несколько сотен строк) в обоих f1 и f2 . Когда строка in f2 вставляется в $3 in f1 , значение in $1 of f1 добавляется к нему в конце строки с помощью a /test/id/$1_raw.file_fixed.txt . $1 Значение f1 также из. Большая часть этого — статический текст, за исключением того, что значение from $1 находится после третьего / . Строки, начинающиеся с R_2019 , просто печатаются как есть и не используются для поиска совпадения. Выполняется awk , но результат остается неизменным. Спасибо :).

Я также попробовал другой awk (попытка 2), но безуспешно. Я вижу, что строка в f2 считывается $id , но я не могу найти частичное совпадение f1 . Спасибо :).

f1

 xyxy_0268 0000-yyyy
xyxy_0270 1111-xxxx
R_0000_00_02_00_45_32_xxxx_x0-0000-100-x0.0_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx
 

f2

 /path/to/the/xxx/data/0000-yyyy_v1_0000-yyyy_RNA_v1/190326-Control_v1_20190328071906449 
/path/to/the/xxx/data/00-0000_xxxx-03_v1/00-0000_xxxx-03_v1_20190322115521953
/path/to/the/xxx/data/1111-xxxx-03_v1/1111-xxxx-03_v1_20190322115521953
 

желаемый

 xyxy_0268 0000-yyyy /path/to/the/xxx/data/0000-yyyy_v1_0000-yyyy_RNA_v1/190326-Control_v1_20190328071906449/test/id/xyxy_0268_raw.file_fixed.txt
xyxy_0270 1111-xxxx /path/to/the/xxx/data/1111-xxxx-03_v1/1111-xxxx-03_v1_20190322115521953/test/id/xyxy_0270_raw.file_fixed.txt
R_0000_00_02_00_45_32_xxxx_x0-0000-100-x0.0_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx
 

awk

 awk 'NR==FNR {for(i=1; i<=NF; i  ) id[$i]=$1; next} $2 in id{$3=id[$i] "/test/id/" $1 "_raw.file_fixed.txt"}1' f2 f1

awk 'NR==FNR {for(i=1; i<=NF; i  ) id[$i]=$1; next} $2 in id{$3=id/$2/ "/test/id/" $1 "_raw.file_fixed.txt"}1' f2 f1
 

Комментарии:

1. что должно произойти, если, как вы говорите, имеется более одного совпадения?

2. Между двумя файлами может быть несколько совпадений, но только по одному на строку. Каждое совпадение в f1 будет уникальным для одной строки в f2 , а совпадающие строки в f2 объединяются с f1 . Спасибо :).

Ответ №1:

$2 in id не будет делать то, что вы ожидаете, вам нужно проверять каждый ключ массива в цикле, используя index .

 $ awk 'NR==FNR{a[$0];next} NF>1{for(b in a){if(index(b,$2)){$3=b;delete a[b]}}} 1' f2 f1
xyxy_0268 0000-yyyy /path/to/the/xxx/data/0000-yyyy_v1_0000-yyyy_RNA_v1/190326-Control_v1_20190328071906449 
xyxy_0270 1111-xxxx /path/to/the/xxx/data/1111-xxxx-03_v1/1111-xxxx-03_v1_20190322115521953
R_0000_00_02_00_45_32_xxxx_x0-0000-100-x0.0_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx

 

Комментарии:

1. Большое вам спасибо :).

Ответ №2:

Не могли бы вы попробовать следующее (этот код был написан только в соответствии с показанными примерами).

 awk 'FNR==NR{a[$0];next} {flag="";for(i in a){match(i,$2);if(substr(i,RSTART,RLENGTH)){flag=1;print $0,i}}} !flag' Input_file2  Input_file1
 

Комментарии:

1. @justaguy, не могли бы вы попробовать один раз и дать мне знать, если это поможет?

2. это работает, но что, если $ 2 содержит специальные символы, такие как ?* ?

3. @oguzismail, код был написан в соответствии с приведенными примерами, извините, но ничего не предполагал с моей стороны, если хотите, пожалуйста, не стесняйтесь редактировать мое решение с комментариями (мы тоже будем учиться на нем), спасибо.

4. @oguzismail, в эти дни я стал менее активным (много работы), я всегда даю подробное объяснение способа, постараюсь добавить и здесь (если не буду спать в ближайшие несколько минут), спасибо и приветствия, приятель.