Shell-Script
如何從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
上面提到的命令是提取包含整行的關鍵字,但是順序已經改變。此外,它不會為失去的關鍵詞留下空行。因此,請幫助我做同樣的事情。提前致謝。
我認為您的要求需要對關鍵字進行循環。我會推薦以下 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