2016-04-25 10 views
-1

私はgrepとsedを使って情報を変更して要約するためのbashスクリプトを作成しています。しかし、それは固まってしまいます。情報を変更して抽出するための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

あなたはグレープパターンと言っていますが、それにマッチするファイルや文字列は提供していません。 – fedorqui

+0

これは[XY問題](http://xyproblem.info/)です。シェルは、これらの呼び出しをシーケンスするための言語を持つツールを呼び出すための環境です。あなたがしていることは、テキストを操作することです。テキストを操作するUNIXツールはawkなので、grepやsedへの呼び出しをラップするシェルスクリプトの代わりに、単純なawkスクリプトを1つだけ使うべきです。あなたが簡潔でテスト可能なサンプル入力と期待される出力を投稿すれば、正しい方法を実行する必要があるかどうかをあなたが手助けすることができます。 –

答えて

0

まず、および@fedorquiはコメントとして - あなたはそれがラインのマッチングを行います、これに対して入力のソース、とgrepを提供していません。 配列

  • ストア一致する行、または

    第二に、あなたには、いくつかのデータを操作することを決定し、将来的に不要な行動、になりますあなたのスクリプト内のいくつかの問題があり、ファイルから、後で値を読み込みます。変数ONLYは、タスクの正しいデータ構造ではありません。慣例により

  • 、環境変数(PATHEDITORSHELL、...)と内部シェル変数(BASH_VERSIONRANDOM、...)は、完全に資産計上されます。他のすべての変数名は小文字でなければなりません。 の変数名では大文字と小文字が区別されるため、この慣習は誤って環境変数や内部変数を上書きしないようにします。

ここが、あなたが最後の行でやろうとしていたものについては未解決の問題と、これらの点を考慮すると、スクリプトの改良版だ:書き込むための正しい方法は

#!/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

grep R $ONLYR | wc -lあなたがやろうとしているように見える何をすべきかシェルスクリプトは次のようになります。ちょうどあなたが今日そうであるように、ファイルmyscript.shにし、それを実行することを置く

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

明らかに - 上記のコードの大部分はawkスクリプトです。シェルスクリプト部分は、シェルが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システムでは、確実に動作します。

関連する問題