awk частичное совпадение для добавления текста в файл - PullRequest
0 голосов
/ 17 апреля 2019

В awk ниже я пытаюсь cp и paste или обновить каждую соответствующую строку в f2 до $3 в f1, если $2 из f1 находится в строке вf2 где-то.Всегда будет совпадение (обычно больше 1), и мои фактические данные будут намного больше (несколько сотен строк) как в f1, так и f2.Когда строка в f2 вставляется в $3 в f1, значение в $1 из f1 добавляется к ней в конце строки с помощью /test/id/$1_raw.file_fixed.txt.Значение $1 также от f1.В основном это статический текст, за исключением того, что значение из $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

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

$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

2 голосов
/ 17 апреля 2019

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...