【问题标题】:unix awk column equal to a variableunix awk 列等于一个变量
【发布时间】:2015-08-17 07:30:03
【问题描述】:

我想打印两列等于一个变量的行,例如输入:

2607s1  NC_000067.6 95.92   49  1   1   3   50  1e-14   84.2
2607s1  NC_000067.6 97.73   44  1   0   7   50  4e-14   84.2
2607s1  NC_000067.6 97.67   43  1   0   8   50  1e-13   75.0

第一列和最后一列的变量:

a="2607s1"; b="84.2"

并使用 awk 命令,输出:

2607s1  NC_000067.6 95.92   49  1   1   3   50  1e-14   84.2
2607s1  NC_000067.6 97.73   44  1   0   7   50  4e-14   84.2

我尝试了以下方法但没有用:

awk -v '$1==$a' && '$10==$b' test_file
cat test_file|awk '$1=="($a)" && $10=="($b)"'
cat test_file|awk '$1==($a) && $10==($b)'
cat test_file|awk '$1=="$a" && $10=="$b"'

此外,我在一个while循环中运行它,所以$a$b不断变化请帮助..

【问题讨论】:

  • wrt I am running it in a while loop - 使用 shell 循环来操作文本总是错误的方法。最终的结果总是冗长、笨拙、脆弱、容易出错、速度慢且通常是糟糕的软件,因为这不是 shell 的用途。您可能想在单独的问题中就较大脚本的那部分寻求帮助。

标签: bash variables unix awk while-loop


【解决方案1】:

您使用错误的方法将 shell 变量传递给 awk 命令。应该是这样的

awk -v a="$a" -v b="$b" '$1==a && $10 == b' 

它的作用

  • -v a="$a" 创建一个 awk 变量 a 并将 shell 变量 $a 的值分配给它。

  • -v b="$b" 创建 awk 变量 b

awk '$1==a && $10 == b' a="$a" b="$b" file

当你写出这样的陈述时

awk -v '$1==$a' && '$10==$b' test_file

awk 不知道 $a $b 是什么,因为它们都是 shell 变量。

使用-v传递shell变量的正确方法如示例中所示。

来自 awk 手册

-v var=val

   --assign var=val

    Assign  the  value  val to the variable var, before execution of
    the program begins.  Such variable values are available  to  the
    BEGIN block of an AWK program.


测试
$ cat file 
2607s1  NC_000067.6 95.92   49  1   1   3   50  1e-14   84.2
2607s1  NC_000067.6 97.73   44  1   0   7   50  4e-14   84.2
2607s1  NC_000067.6 97.67   43  1   0   8   50  1e-13   75.0

$ a="2607s1"; b="84.2"

$ awk -v a="$a" -v b="$b" '$1==a && $10 == b' file 
2607s1  NC_000067.6 95.92   49  1   1   3   50  1e-14   84.2
2607s1  NC_000067.6 97.73   44  1   0   7   50  4e-14   84.2

【讨论】:

  • 它有效!,在这种情况下可以不使用 -v 标志吗?
  • @once 恐怕不行 :( 这是将 shell 变量传递到 awk 脚本的唯一方法。
  • 这不是唯一的方法,尽管它是最好的。你也可以awk '$1==a && $10 == b' a="$a" b="$b" file
  • @User112638726 哎呀我真的错过了。会补充回答。谢谢
  • 是的,还有另一种方法。我一开始就错过了。查看@User112638726 的更新答案或评论
【解决方案2】:

你也可以这样做(这样可以避免使用 -v 参数)

awk '$1=="'$a'" && $10=="'$b'"' file

$a 之前的引号 ' 将关闭字符串解释。

$a 之后的引号 ' 将打开字符串解释。

$a 以这种方式被其值解释和替换。

【讨论】:

    【解决方案3】:

    你可以试试下面的 awk 命令。

    awk -v var1="$a" -v var2="$b" '$1==var1&&$NF==var2' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多