AWK - 如何获得它们之间相等的值?如果... $ 1 == $ 1?

时间:2015-08-20 11:58:29

标签: awk escaping variable-expansion

我正在处理DNA序列列表。我想得到所有相同名称的序列($ 1)。我在考虑使用if ($1 == "$1")。但这不起作用。

result_file:

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

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

2 个答案:

答案 0 :(得分: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块。

答案 1 :(得分:1)

如果我理解正确,您希望使用shell脚本中的$1作为其中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