使用awk或bash解析行

使用awk或bash解析行,awk,perl,shell,Awk,Perl,Shell,我有一个包含以下类型行的文件: M00677:223:000000000-AB9BD:1:1101:2086:16648 163 AY243312 66733 0 95M22S = 66733 108 ACATCATACCGATAGGAATACAAGACACTTTGCCGGCGGTTGTAGATTTATCATATTTTTTCCCTACACATTCGTTACCATTTGTTTAAAATTTATATAACACTATATTTTTC

我有一个包含以下类型行的文件:

 M00677:223:000000000-AB9BD:1:1101:2086:16648    163     AY243312        66733   0       95M22S  =       66733   108     ACATCATACCGATAGGAATACAAGACACTTTGCCGGCGGTTGTAGATTTATCATATTTTTTCCCTACACATTCGTTACCATTTGTTTAAAATTTATATAACACTATATTTTTCTCTT      BBBBBFFFFFBBGGEGGGGGGGHHHHHHHHHHHHGGGGGA00155555D5@55555DDGG@33333132334443B113B4BF4BC24BFH43B44B44443333444444B3??4B   NM:i:6  MD:Z:60C1A5T2C6A7A8     AS:i:65 XS:i:65    XA:Z:AY313847,+69566,95M22S,6;AY678276,+69234,95M22S,7;M35027,+69864,95M22S,7;
 M00677:223:000000000-AB9BD:1:1101:3187:21406    99      AY313847        80978   0       68M43S  =       80978   36      TTATTCCATCTGTGGAAAATAATACTCTGACATTATCGCTAATTGACACATCGGTGAGTGATCTGCCTCTACCTTCCTCCTCTTCTTTTTTCCCATATACCCGTGTACCCG    BBBABFFFFFFFAFFGGGGGGGFHHGFGFFHHCFAFFGFFGGHHHGHHGBHGEDEEFHHHHHHGHFHHHGHHHHHHHHHHHHHHHHHHFFEGHHHHBGHHHHGGGHHHHFG NM:i:2  MD:Z:0C61A5     AS:i:62 XS:i:61 XA:Z:AY678276,+80652,68M43S,2;M35027,+81282,68M43S,2;AY243312,+78151,68M43S,2;
我要过滤并只获取AS:I:tag后面的数字大于XS:I:tag后面的数字的行。因此,在这种情况下,只应打印第二行

我曾试图用bash编写一个复杂的脚本,但转换成数组,然后解析ifs并没有起作用,听起来太复杂了

我能用awk做这个吗

谢谢,
Adrian

使用Python和常规体验怎么样?也许是类似的

import re

regex1 = r"AS:i:(?P<as_val>\d*)"
regex2 = r"XS:i:(?P<xs_val>\d*)"

m = re.search(regex1, string1)
if m and m.group('as_val') is not None:
   asVal = float(m.group('as_val'))

m = re.search(regex2, string1)
if m and m.group('as_val') is not None:
   xsVal = float(m.group('xs_val'))

if asVal > xsVal ...
重新导入
regex1=r“AS:i:(?P\d*)”
regex2=r“XS:i:(?P\d*)”
m=重新搜索(regex1,string1)
如果m和m.group('as_val')不是无:
asVal=浮动(m.group('as_val'))
m=重新搜索(regex2,string1)
如果m和m.group('as_val')不是无:
xsVal=float(m.group('xs_val'))
如果asVal>xsVal。。。

这是我不知道的,但它应该非常接近您所需要的。

使用Python和常规体验如何?也许是类似的

import re

regex1 = r"AS:i:(?P<as_val>\d*)"
regex2 = r"XS:i:(?P<xs_val>\d*)"

m = re.search(regex1, string1)
if m and m.group('as_val') is not None:
   asVal = float(m.group('as_val'))

m = re.search(regex2, string1)
if m and m.group('as_val') is not None:
   xsVal = float(m.group('xs_val'))

if asVal > xsVal ...
重新导入
regex1=r“AS:i:(?P\d*)”
regex2=r“XS:i:(?P\d*)”
m=重新搜索(regex1,string1)
如果m和m.group('as_val')不是无:
asVal=浮动(m.group('as_val'))
m=重新搜索(regex2,string1)
如果m和m.group('as_val')不是无:
xsVal=float(m.group('xs_val'))
如果asVal>xsVal。。。
这是我不知道的,但它应该非常接近您所需要的。

在一个:

$perl-lne'/AS:i:(\d+)\s*XS:i:(\d+)/;如果$2<$1'file.txt,则打印
在一个:

$perl-lne'/AS:i:(\d+)\s*XS:i:(\d+)/;如果$2<$1'file.txt,则打印
假设:

  • 字段顺序不变
  • AS:i:
    XS:i:
    XA:Z:
    组出现在每一行中
  • 这些字段分隔符不会在任何行中重复
那么以下几点对我来说很有用:

awk -F"AS:i:|XS:i:|XA:Z:" '$2 > $3' data
设置字段分隔符值,然后测试每行的值。

假设:

  • 字段顺序不变
  • AS:i:
    XS:i:
    XA:Z:
    组出现在每一行中
  • 这些字段分隔符不会在任何行中重复
那么以下几点对我来说很有用:

awk -F"AS:i:|XS:i:|XA:Z:" '$2 > $3' data

通过设置字段分隔符值,然后测试每行的值。

我对您的数据做了一些假设,主要是AS标记始终是字段14,XS标记始终是字段15(空格分隔)。如果是这样的话,并且我很理解你的问题,这应该可以做到:

awk '{ split($14, as_parts, ":"); split($15, xs_parts, ":"); if (as_parts[3] > xs_parts[3]) print; }' file.txt

我对您的数据做了一些假设,主要是AS标记总是字段14,XS标记总是字段15(以空格分隔)。如果是这样的话,并且我很理解你的问题,这应该可以做到:

awk '{ split($14, as_parts, ":"); split($15, xs_parts, ":"); if (as_parts[3] > xs_parts[3]) print; }' file.txt

假设在每行中,
AS:i:
总是在
XS:i:
之前,这是我能想到的最短的
awk
1行:

awk -F"[AX]S:i:" '$2 > $3' infile
输出
假设在每行中,
AS:i:
总是在
XS:i:
之前,这是我能想到的最短的
awk
1行:

awk -F"[AX]S:i:" '$2 > $3' infile
输出 这是稳健的

#!/usr/bin/awk -f
{
  split($0, foo)
  for (bar in foo) {
    split(foo[bar], baz, ":")
    if (baz[1] == "AS") asi = baz[3]
    if (baz[1] == "XS") xsi = baz[3]
  }
  if (asi > xsi) print
}
这是稳健的

#!/usr/bin/awk -f
{
  split($0, foo)
  for (bar in foo) {
    split(foo[bar], baz, ":")
    if (baz[1] == "AS") asi = baz[3]
    if (baz[1] == "XS") xsi = baz[3]
  }
  if (asi > xsi) print
}

看起来这就是你所需要的:

awk -F'[: \t]+' '$27 > $30' file
或更灵活地使用GNU awk和gensub()


看起来这就是你所需要的:

awk -F'[: \t]+' '$27 > $30' file
或更灵活地使用GNU awk和gensub()


+1为清晰起见,无需对标签的顺序或位置做出任何假设。+1为清晰起见,无需对标签的顺序或位置做出任何假设。