2016-04-25 41 views
-1

我正在创建一个bash脚本来修改和汇总grep和sed的信息。但它卡住了。bash脚本来修改和提取信息

#!/bin/bash 

# This script extracts some basic information 
# from text files and prints it to screen. 
# 
# Usage: ./myscript.sh </path/to/text-file> 


#Extract lines starting with ">@HWI" 

    ONLY=`grep -v ^\>@HWI` 

#replaces A and G with R in lines 

    ONLYR=`sed -e s/A/R/g -e s/G/R/g $ONLY` 

    grep R $ONLYR | wc -l 
+4

你有种说法是'grep pattern',但不提供任何文件或字符串来匹配它。 – fedorqui

+0

这是一个[XY问题](http://xyproblem.info/)。 shell是一个可以通过语言来调用工具的环境,以便对这些调用进行排序。你在做什么是操纵文字。用于处理文本的UNIX工具是awk,所以不要使用包含调用grep和sed的shell脚本,而应该只使用一个简单的awk脚本。如果你发布简洁,可测试的样本输入和期望的输出,我们可以帮助你做任何你需要做的正确的方式。 –

回答

0

首先,和@fedorqui评论 - 你不提供grep与输入源,防止其将执行线匹配。

其次,有一些问题在你的脚本,这将导致在未来不受欢迎的行为,当你决定要操纵一些数据:在阵列

  • 商店匹配行,或文件,您稍后将从中读取值。变量ONLY不是该任务的正确数据结构。
  • 按照惯例,环境变量(PATHEDITORSHELL,...)和内部shell变量(BASH_VERSIONRANDOM,...)是完全资本化。所有其他变量名称应该是小写。由于 变量名称区分大小写,因此此惯例避免意外覆盖环境和内部变量。

这里有一个更好的版本的剧本,考虑到这些问题,但是对于你试图在最后一行做一个悬而未决的问题:grep R $ONLYR | wc -l

#!/bin/bash 

# This script extracts some basic information 
# from text files and prints it to screen. 
# 
# Usage: ./myscript.sh </path/to/text-file> 

input_file=$1 

# Read lines not matching the provided regex, from $input_file 
mapfile -t only < <(grep -v '^\>@HWI' "$input_file") 

#replaces A and G with R in lines 
for((i=0;i<${#only[@]};i++)); do 
    only[i]="${only[i]//[AG]/R}" 
done 

# DEBUG 
printf '%s\n' "Here are the lines, after relpace:" 
printf '%s\n' "${only[@]}" 

# I'm not sure what you were trying to do here. Am I gueesing right that you wanted 
# to count the number of R's in ALL lines ? 
# grep R $ONLYR | wc -l 
1

正确的方式来写一个shell脚本来完成你仿佛是试图做的是:

awk ' 
    !/^>@HWI/ { 
     gsub(/[AG]/,"R") 
     if (/R/) { 
      ++cnt 
     } 
    END { print cnt+0 } 
' "[email protected]" 

就放进了文件myscript.sh和你今天做执行它。

要清楚 - 上面的代码的大部分是awk脚本,shell脚本部分是shell只是调用awk并将其传递给输入文件名的第一行和最后一行。

如果你想有中间变量,那么你可以创建/打印与他们:

awk ' 
    !/^>@HWI/ { 
     only = $0 
     onlyR = only 
     gsub(/[AG]/,"R",onlyR) 
     print "only:", only 
     print "onlyR:", onlyR 
     if (/R/) { 
      ++cnt 
     } 
    END { print cnt+0 } 
' "[email protected]" 

以上将工作强劲,便携,并有效地对所有的UNIX系统。