1

私はDNA配列のリストを扱っています。同じ名前 ($1) のすべてのシーケンスを取得したいと思います。を使おうと思っていましif ($1 == "$1")た。しかし、これはうまくいきません。

結果ファイル:

name1 number1 number2 sequenceofname1
name1 number3 number4 sequenceofname1

脚本:

awk '{if ($1 == "$1") printf("%s_%s_%s \t%s\n", $1,$2,$3,$4);}' <result_file >file.txt

$1awk コマンドに渡すにはどうすればよいですか?

4

2 に答える 2

3

-v オプションを使用できます

awk -v name="name1" '{
  if ($1 == name) printf("%s_%s_%s \t%s\n", $1,$2,$3,$4);
}' result_file > file.txt

または、スクリプト内のこのステートメントの場合

awk -v name="$1" '{
  if ($1 == name) printf("%s_%s_%s \t%s\n", $1,$2,$3,$4);
}' result_file > file.txt

-v var=val, プログラムの実行が始まる前に、値 val を変数 var に割り当てます。このような変数値は、AWK プログラムの BEGIN ブロックで使用できます。

于 2015-08-20T12:07:15.310 に答える
1

私が正しく理解していれば$1、シェルスクリプトからawkコマンドへの引数として使用したいと考えています。

その場合、$1展開したい部分を引用しないで、残りのawkコマンドを引用します。1 つの可能性は、コマンドを二重引用符で囲むことです。

awk "{if (\$1 == \"$1\") printf(\"%s_%s_%s \\t%s\\n\", \$1,\$2,\$3,\$4);}"

すべてのバックスラッシュを管理するのは難しくなる可能性があるため、コマンドの大部分をシングル クォーテーションで囲み、展開する部分をダブル クォーテーションで囲むことをお勧めします。

awk '{if ($1 == "'"$1"'") printf("%s_%s_%s \t%s\n", $1,$2,$3,$4);}'

読むのは少し難しいです - 重要なビットは として分割され'...($1 == "' "$1" '")...'ます。そのため、Awk コマンドの一部である二重引用符と、シェル用の二重引用符を 1 つにまとめ$1ます。

ああ、呼び出す必要はありませんcat-ファイルを入力として提供するだけです:

awk ...  <result_file >file.txt
于 2015-08-20T12:26:19.320 に答える