Excel 파일에서 행을 포함하는 키워드를 추출하는 방법은 무엇입니까?

Excel 파일에서 행을 포함하는 키워드를 추출하는 방법은 무엇입니까?

특정 키워드 파일에 지정된 순서대로 Excel 파일(.xls)에서 행이 포함된 키워드를 추출해야 합니다. 예를 들어 아래와 같이 Excel 파일(예: 게놈.xls)이 있습니다.

NC_0208.1   18918   94692   amyl4_A0A0H         1   54  194
NC_0208.1   18839   86123   prot4_A0A0          1   79  137
NC_0208.4   29761   74985   lip10_H8FLU5        2   393 48
NC_0208.2   29687   67745   lysin6_A0A0Q5       5   38  49 

아래와 같이 키워드 파일(예: id.txt)이 있습니다.

prot
lip
cellulase
lysin
amyl

예상 출력은 다음과 같습니다.

NC_0208.1   18839   86123   prot4_A0A0          1   79  137
NC_0208.4   29761   74985   lip10_H8FLU5        2   393 48

NC_0208.2   29687   67745   lysin6_A0A0Q5       5   38  49 
NC_0208.1   18918   94692   amyl4_A0A0H         1   54  194

또한, 게놈 파일에 키워드가 없으면 출력 파일에서 전체 줄을 비워 두어야 합니다. 이를 위해 아래와 같이 grep 명령을 사용했습니다.

grep 'prot\|lip\|cellulase\|lysin\|amyl' genome.xls > result.xls

위 명령은 전체 행을 포함하는 키워드를 추출하지만 순서가 변경되었습니다. 또한 누락된 키워드에 대해 빈 줄을 남기지 않습니다. 그러니 나도 그렇게 할 수 있도록 도와주세요. 미리 감사드립니다.

답변1

이 시도,

while read a ; do grep "$a" genome.xls || printf "\n" ; done < id.txt 

NC_0208.1   18839   86123   prot4_A0A0          1   79  137
NC_0208.4   29761   74985   lip10_H8FLU5        2   393 48

NC_0208.2   29687   67745   lysin6_A0A0Q5       5   38  49 
NC_0208.1   18918   94692   amyl4_A0A0H         1   54  194

답변2

귀하의 요구 사항에는 키워드 반복이 필요하다고 생각합니다. 나는 다음 셸 스크립트를 권장합니다(원하는 경우 한 줄로 처리할 수도 있음).

#!/bin/bash

while read keyword
do
    # Apply grep, but store result in variable
    MATCH="$(grep $keyword genome.xls)"

    # If grep result is an empty string, output an empty line,
    # otherwise the grep result as-is.
    if [[ -z "$MATCH" ]]
    then
        echo
    else
        echo "$MATCH"
    fi
done < id.txt

내용을 반복하여 출력 순서를 보장할 수 있습니다 id.txt.

호출 스크립트

user@host$ ./extract_lines.sh > result.xml

스크립트를 보다 유연하게 만들기 위해 파일을 명령줄 인수 또는 명령줄 인수 목록으로 처리하도록 설정할 수 있습니다.

#!/bin/bash

if [[ "$#" == "0" ]]
then
    echo "Usage: $0 <filename(s)>"
    exit 1
fi


for file in "$@"
do
    outfile=${file/.xls/_result.xls}
    :>$outfile

    echo "Process $file, write results to $outfile"


    while read keyword
    do
    # Apply grep, but store result in variable
    MATCH="$(grep $keyword $file)"

    # If grep result is an empty string, output an empty line,
    # otherwise the grep result as-is.
    if [[ -z "$MATCH" ]]
    then
            echo "" >> $outfile
    else
            echo "$MATCH" >> $outfile
    fi
    done < id.txt
done

이것은 명령줄 인수로 지정된 모든 파일을 반복 *.xls하고 결과를 기록합니다 <input_filename>_result.xls.

노트*그러나 이 구문은 파일 이름 사양을 "globs"(예: 와 같은 와일드카드) 및 인수 목록의 일반 파일 이름과 혼합하면 안 되기 때문에 약간 초보적입니다 .

관련 정보