他の複数のファイルの特定の列に対して1つのファイルのすべての行をgrepする方法は?

他の複数のファイルの特定の列に対して1つのファイルのすべての行を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
...

現在のディレクトリには、マージされた.txtの行に似た名前の複数の.xlsファイルがあります。例: GO_GLUTAMINE_FAMILY_AMINO_ACID_METABOLIC_PROCESS.xls

この .xls ファイルで「GENE_TITLE」という列のすべての項目を検索し、「METRIC SCORE」という列に「YES」があります。

このファイルは次のとおりです。

 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の情報を使用せずに「yes」とマークされた値を取得できず、すべてのファイルから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

ベストアンサー1

xargs -I {} awk '$8 == "Yes" { title = title OFS $5 } END { print substr(FILENAME,1,length(FILENAME)-4), title }' {}.xls <combined.txt

これは、ファイルにリストされている各名前に対してxargsプログラムを実行するために使用されます。awkcombined.txt

プログラムは、awkファイルから読み取った名前を入力ファイルとして名前の末尾に追加しますcombined.txt.xls

プログラムawkは、各行について、列5から列8までのデータを収集しますYes。その後、この文字列は最後の4文字(ファイル名のサフィックス)が切り捨てられた状態でファイル名で印刷されます。

おすすめ記事