1

我正在处理一份 DNA 序列列表。我想获得所有具有相同名称($ 1)的序列。我在想用if ($1 == "$1"). 但这不起作用。

结果文件:

name1 number1 number2 sequenceofname1
名称 1 编号 3 编号 4 名称 1 的序列

脚本:

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

如何传递$1给我的 awk 命令?

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

如果我理解正确,您希望使用$1shell 脚本作为其中awk命令的参数。

在这种情况下,您不想引用$1要扩展的,而是引用命令的其余部分awk。一种可能性是双引号命令:

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 命令的一部分,一个是用于 shell 的,要保持$1在一个整体中。

哦,不需要调用cat- 只需提供文件作为输入:

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