Shell-Script

如何從excel文件中提取包含行的關鍵詞?

  • November 19, 2019

我需要按照給定關鍵字文件中指定的順序從 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

上面提到的命令是提取包含整行的關鍵字,但是順序已經改變。此外,它不會為失去的關鍵詞留下空行。因此,請幫助我做同樣的事情。提前致謝。

我認為您的要求需要對關鍵字進行循環。我會推薦以下 shell 腳本(儘管如果你願意,你可以吸收到一個單行中):

#!/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”(即萬用字元,如 )和正常文件名混合使用。

試試這個,

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

引用自:https://unix.stackexchange.com/questions/552929