Text-Processing
如何從多個其他文件的特定列中的一個文件中grep所有行?
我有一個文件:combined.txt 像這樣:
GO_GLUTAMINE_FAMILY_AMINO_ACID_METABOLIC_PROCESS REACTOME_APC_CDC20_MEDIATED_DEGRADATION_OF_NEK2A LEE_METASTASIS_AND_RNA_PROCESSING_UP RB_DN.V1_UP REACTOME_ABORTIVE_ELONGATION_OF_HIV1_TRANSCRIPT_IN_THE_ABSENCE_OF_TAT ...
在我的目前目錄中,我有多個 .xls 文件,它們的名稱類似於 combine.txt 中的行,例如:GO_GLUTAMINE_FAMILY_AMINO_ACID_METABOLIC_PROCESS.xls
在那些 .xls 文件中,我想檢索名為 GENE_TITLE 的列中的所有內容,在名為“METRIC SCORE”的列中我有“是”
這些文件看起來像:
NAME PROBE GENE SYMBOL GENE_TITLE RANK IN GENE LIST RANK METRIC SCORE RUNNING ES CORE ENRICHMENT row_0 MKI67 null null 51 3.389514923095703 0.06758767 Yes row_1 CDCA8 null null 96 2.8250465393066406 0.123790346 Yes row_2 NUSAP1 null null 118 2.7029471397399902 0.17939204 Yes row_3 H2AFX null null 191 2.3259851932525635 0.22256653 Yes row_4 DLGAP5 null null 193 2.324765920639038 0.2718671 Yes row_5 SMC2 null null 229 2.2023487091064453 0.31562105 No row_6 CKS1B null null 279 2.0804455280303955 0.3555722 No row_7 UBE2C null null 403 1.816525936126709 0.38350475 No
在輸出文件中,我將在每一行中都有:
GO_GLUTAMINE_FAMILY_AMINO_ACID_METABOLIC_PROCESS 51 96 118 191 193 <name of the particular line in combined.txt> <list of all entries in GENE_TITLE which have METRIC SCORE=Yes>
到目前為止我嘗試的是:
grep -iw -f combined.txt *.xls > out1
我也試過這個,但在這裡我沒有使用來自combined.txt的資訊,也沒有獲取標有“是”的值,只是從所有文件中提取第5列
awk '{ a[FNR] = (a[FNR] ? a[FNR] FS : "") $5 } END { for(i=1;i<=FNR;i++) print a[i] }' $(ls -1v *.xls) > out2
這可能更接近一點,但仍然不存在:
awk 'BEGIN {ORS=" "} BEGINFILE{print FILENAME} {print $5 " " $8} ENDFILE{ printf("\n")}' *.xls > out3
我得到類似的東西:
GENE_TITLE GENE 1 Yes 4 Yes 11 Yes 23 Yes 49 Yes 76 Yes 85 Yes 118 No 161 No.... GENE_TITLE GENE 0 Yes 16 No 28 Yes 51 Yes 63 No 96 Yes 182 Yes 191 Yes ...
所以我想要的輸出將不是“GENE_TITLE GENE”而是它確實從中獲取這些值的文件的名稱(沒有.xls後綴):0是16否28是51是63否96……不包括那個沒有”
更新
我確實得到了我需要的文件,但我寫了最醜陋的程式碼(見下文)。如果有人有更優雅的東西,請分享。
這就是我得到它的方式:
awk '{print FILENAME " "$5 " "$8}' *.xls | awk '!/^ranked/' | awk '!/^gsea/'| awk '!/^gene/' | awk '$3!="No" {print $1 " " $2}' | awk '$2!="GENE_TITLE" {print}' |awk -v ncr=4 '{$1=substr($1,0,length($1)-ncr)}1' | awk -F' ' -v OFS=' ' '{x=$1;$1="";a[x]=a[x]$0}END{for(x in a)print x,a[x]}'>out3 grep -iw -f combined.txt out3 > ENTR_combined_SET.txt
xargs -I {} awk '$8 == "Yes" { title = title OFS $5 } END { print substr(FILENAME,1,length(FILENAME)-4), title }' {}.xls <combined.txt
這用於為文件中列出的每個名稱
xargs
執行一個程序。awk``combined.txt
程序被賦予從文件
awk
中讀取的任何名稱,並添加到名稱的末尾作為其輸入文件。combined.txt``.xls
awk
程序從第 8 列為 的每一行收集第 5 列的數據Yes
。然後將該字元串與文件名一起列印,最後四個字元(文件名後綴)被剪掉。