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

あなたの要件にはキーワードの繰り返しが必要だと思います。私は次のシェルスクリプトをお勧めします(必要に応じて1行で処理することもできます)。

#!/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"(たとえばワイルドカードなど)や引数リストの一般的なファイル名と混在させないため、少し初心的です。

関連情報