2

次のコマンドを使用して、特定の位置で文字列から文字を抽出しています。

left=1; right=4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | tail -n 1 | awk '{print substr($0,1,4)}'

そして、この正しい出力を取得します:

GTTG

ここで、 14を bash 変数leftrightの値に置き換えたいと思います。

私はこれを試しました:

left=1; right=4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | tail -n 1 | awk -v l=$left r=$right '{print substr($0,l,r)}'

awk: cmd. 行:1: 致命的: ファイル `{print substr($0,l,r)}' を読み取り用に開くことができません

何か提案はありますか?ありがとう。

編集:実際に読むことができるように、以下のコメントからコピーしました:

何を検索するか (たとえば ETM21CH01EPU3Z) とその位置が書かれたファイルもあります。したがって、コード全体は次のとおりです。

while read -r line; do
   echo $line;
   name=`echo $line | cut -d' ' -f 1`;
   left=`echo $line | cut -d' ' -f 2`;
   right=`echo $line | cut -d' ' -f 3`;
   grep $name -A1 SLf_454.fna | tail -n 1 | awk -v l=$left -v r=$right '{print substr($0,l,r)}';
done < CL6o_blastoutput_SLf_454.fna_out 
4

2 に答える 2

3

@dogbaneは、あなたが求めた具体的な答えをくれましたが、パターンを見つけた後に行の最初の4文字を出力するためだけに、コマンドとパイプの長いチェーンは必要ありません。代わりにこれを試してください:

left=1; right=4; awk -v l="$left" -v r="$right" 'f{print substr($0,l,r);f=0} /ETM21CH01EPU3Z/{f=1}' SLf_454.fna

明らかに、これが使用しているすべての場合、左と右のシェル変数は必要ありません。

awk -v l="1" -v r="4" 'f{print substr($0,l,r);f=0} /ETM21CH01EPU3Z/{f=1}' SLf_454.fna

編集:スクリプトを読み取ることができるように、コマンドを元の質問にコピーしました。

これを試してください(テストされていません):

awk -F, '
NR==FNR { left[$1]=$2; right[$1]=$3; next }
{
   for (name in found) {
      print substr($0,left[name],right[name])
      delete found[name]
   }
   for (name in left) {
      if ($0 ~ name) {
         found[name]
      }
   }
}
' CL6o_blastoutput_SLf_454.fna_out SLf_454.fna
于 2013-01-29T14:49:02.927 に答える
2

変数の-v前にaがありません。right渡す変数はすべてawk、前に。を付ける必要があります-v

次のように変更します。

awk -v l=$left -v r=$right '{print substr($0,l,r)}'
于 2013-01-29T14:43:41.750 に答える