使用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为清晰起见,无需对标签的顺序或位置做出任何假设。