【问题标题】:Using multiple conditions in awk在 awk 中使用多个条件
【发布时间】:2015-01-18 11:37:31
【问题描述】:

我想根据多个条件(来自同一个文件)以及从其他小文件中的模式搜索从大文件中提取信息,以下是我使用的脚本:

awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[$0]++;next}$1 in a {print $2,$4,$5}' file2.txt file1.txt >output.txt

现在,我想在同一个 awk 脚本中使用该条件,该脚本仅打印第 4 列的元素(ATGC 中的任何一个字符)与第 5 列的元素(ATGC 中的任何一个字符)匹配的行;这两列都在文件 1 中。

因此,在某种程度上,我想将以下脚本与上述脚本合并

awk '$4 " "==$5{print $2,$4,$5}' file1.txt

以下是file1.txt的表示:

SNP Name    Sample ID   GC Score    Allele1 - Forward   Allele2 - Forward
ARS-BFGL-BAC-10172  834269752   0.9374  A   G
ARS-BFGL-BAC-1020   834269752   0.9568  A   A
ARS-BFGL-BAC-10245  834269752   0.7996  C   C
ARS-BFGL-BAC-10345  834269752   0.9604  A   C
ARS-BFGL-BAC-10365  834269752   0.5296  G   G
ARS-BFGL-BAC-10591  834269752   0.4384  A   A
ARS-BFGL-BAC-10793  834269752   0.9549  C   C
ARS-BFGL-BAC-10867  834269752   0.9400  G   G
ARS-BFGL-BAC-10951  834269752   0.5453  T   T


enter code here

下面是file2.txt的表示

    ARS-BFGL-BAC-10172
    ARS-BFGL-BAC-1020
    ARS-BFGL-BAC-10245
    ARS-BFGL-BAC-10345
    ARS-BFGL-BAC-10365
    ARS-BFGL-BAC-10591
    ARS-BFGL-BAC-10793
    ARS-BFGL-BAC-10867
    ARS-BFGL-BAC-10951

输出应该是:

834269752   A   A
834269752   C   C
834269752   G   G
834269752   A   A
834269752   C   C
834269752   G   G
834269752   T   T

【问题讨论】:

  • 您想将$4 " "==$5$1 in a 结合起来,并且只在两者都为真时运行{print $2,$4,$5}
  • 是的,这正是我想做的!
  • && 是合乎逻辑的并且在 awk 中并且可以在模式中使用。 (awk 语法是pattern {action}。)括号也适用于分组和清晰。这对你有帮助吗?
  • 我还以各种可能的方式使用了“&&”和其他布尔值,但它不起作用
  • 请举一些你的 col4 和 col5 的例子,并解释哪个应该被评估为 true 应该是false

标签: awk multiple-conditions


【解决方案1】:

您可以简单地使用布尔逻辑,从您的输入文件看来,您可以摆脱“正常”输入字段拆分,这将允许您在比较中摆脱该空间:

awk 'BEGIN{OFS="\t"}
     NR==FNR{a[$0]++;next}
     ($1 in a) && ($4==$5) {print $2,$4,$5}' file2.txt file1.txt > output.txt

例如,这是我的测试file2.txt

ARS-BFGL-BAC-1020
ARS-BFGL-BAC-10172

这是上面命令的结果:

834269752   A   A

【讨论】:

  • 我已经尝试了各种可能的布尔值,但它不起作用
  • 你说“它不工作”是什么意思?有没有报错,有没有意外的输出?
  • 很抱歉,它给我产生了一个空白文件,如果我分别使用这两个命令,那么它可以工作,但只有在将第一个命令的输出文件中的所有内容复制到一个新文件之后,然后单独运行第二个命令
  • 如果您编辑问题以准确显示您的工作流程,包括head file1.txthead file2.txt 的输出,这将非常有用。如果您使用第一个命令的输出作为第二个命令的输入,我不明白您如何还有足够的列。
  • 我无法上传文件的打印屏幕截图,因为我的声誉低于 10(这是我的第一个问题),并且我无法将“head file1.txt”的结果发布到在这个论坛上的正确方法(当我将文件复制到论坛时,文件的制表符分隔表示会受到干扰),你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2018-05-01
  • 2022-01-08
相关资源
最近更新 更多