我正在处理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
如何将$1
传递给我的awk命令?
答案 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