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