У меня есть два больших файла, и я пытаюсь сопоставить информацию из первого столбца файла_1 с заголовком файла_2. Существует небольшая деталь, заголовок файла_2 имеет некоторую информацию в начале, которая варьируется от столбца к столбцу, но в конце имеет совпадение с шаблоном. В принципе, мне нужно найти, где 'pattern' из файла_1 присутствует в конце имени файла 2 файла и выводить данные с этой информацией.
Пожалуйста, смотрите ниже, как файлы выглядеть следующим образом:Совпадение «шаблона» от одного файла к имени заголовка в другом (R, Unix)
**file_1** dim (757*3) the first column of the file_1 contains patterns
10001-101A3 a t
10008-101B6 b g
10235-104A1 c h
- - -
- - -
etc...
**file_2** dim (4120*1079)
blabla.10001.101A3 blbl.2348.101B6 trsdr.1111.111D2 gfder.10008.101B6 ....
12 1223 544 - -
132 23 3564 - -
14 223 33 - -
162 13 344 - -
**Desired output file-3:** I assume that the output size will be 4120*757
blabla.10001.101A3 gfder.10008.101B6 ....
12 - -
132 - -
14 - -
162 - -
Я пытаюсь получить выход с R (ниже мой сценарий), но я также хотел бы узнать, как я могу это сделать в Unix (я думаю, -awk и -grep могут помочь решить эту проблему).
вот мой R сценарий:
table1=read.table("file2.tsv.gz", quote=NULL, sep='\t', header=T, fill=T)
table2=read.table("file1.txt", quote=NULL, sep='\t', header=T, fill=T)
# dim(table1 4120 * 1079) -> need to reduce amount of columns to 757
# dim(table2 757 * 3)
###### the header in table1 has following view 10001.101A3, thus we need to substitute '-' to '.' in pattern
### What to do:
### 1) Use gsub() function to substitute '-' by '.'
### 2) Use gsub() function to remove space in the end of string ' ' by ''
### 3) Find modified pattern in the end of column's name
### 4) Apply to the entire table
pattern=table2[,1] # '10001-101A3 ' '10008-101B6 '
for (x in pattern) {
ptn=gsub('-','.',x)
ptn1=gsub(' ','',ptn) # pattern to be matched'
# '10001.101A3' '10008.101B6'
find_match=table1[,(grepl('^.+ptn1$', header))]
final_tb=table1[,find_match]
}
Я думаю, что проблема с представлением данных ptn1 в grepl() функции, потому что, когда я вставить 10001.101A3 вместо ptn1 я получаю ответ за один прогон , но, очевидно, мне нужно зациклиться на нем.
Я также попытался получить (ptn1), но все равно не мог заставить его работать.
Буду признателен за ваши комментарии, а также за любые идеи о том, как это можно сделать в Unix (я очень простой пользователь Unix, поэтому не могу реализовать эту задачу на данный момент).
######################## след на малых данныхdf=data.frame(aa24.12a,dda43.23s,fds24.12a,sdf24.112f)
г = с ('24 -12a», '43 - 23s «) # образец
aa24.12a fds24.12a aa24.12a.1 fds24.12a.1
1 2 34 2 34
2 3 2 3 2
3 4 1 4 1
4 56 3 56 3
5 3 5 3 5
header=colnames(df)
for (x in z){
ptn=gsub('-','.',x)
ptn1=gsub(' ','',ptn)# correct pattern
find_match=grep('^.+24.12a$', header)# find match of pattern in header
tbl=df[,find_match]
}
> tbl
aa24.12a fds24.12a
1 2 34
2 3 2
3 4 1
4 56 3
5 3 5
Спасибо