다른 여러 파일의 특정 열에 대해 한 파일의 모든 줄을 grep하는 방법은 무엇입니까?

다른 여러 파일의 특정 열에 대해 한 파일의 모든 줄을 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"라고 표시된 값을 얻지 못하고 모든 파일에서 다섯 번째 열을 추출합니다.

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자(파일 이름 접미사)가 잘린 상태로 파일 이름과 함께 인쇄됩니다.

답변2

쿵쿵 스크립트:

#!/bin/bash

# read combined.txt line by line
while read -r line; do
        # skip missing file ${line}.xls
        [ ! -f "$line".xls ] && continue

        # echo line and one space character (without newline)
        echo -n "$line " >> out

        # get 5th column if line ends with "Yes" and optional whitespace at end of line
        # replace newline '\n' with space ' '
        sed -nE 's/^\S+\s+\S+\s+\S+\s+\S+\s+(\S+).*\sYes\s*$/\1/p' "$line".xls | tr '\n' ' ' >> out

        # add newline
        echo >> out
done < combined.txt

한 줄:

while read -r line; do [ ! -f "$line".xls ] && continue; echo -n "$line " >> out; sed -nE 's/^\S+\s+\S+\s+\S+\s+\S+\s+(\S+).*\sYes\s*$/\1/p' "$line".xls | tr '\n' ' ' >> out; echo >> out; done < combined.txt

각 줄의 out끝에는 추가 공백 문자가 있습니다.

관련 정보