gpt4 book ai didi

awk - 比较 awk 中的当前行和下一行

转载 作者:行者123 更新时间:2023-12-02 02:28:36 24 4
gpt4 key购买 nike

我想找到这样的模式:当前行中的第 2 列是“C”,下一行中的第 2 列是“G”。文件的第 4 列是“CG”。我想比较第 1 与第 2、第 3 与第 4、第 5 与第 6,依此类推。然后打印几行当前行和下一行。“C”可以出现在偶数行和奇数行中。

输入如下:

chr1    C   10467   CHH CT  0.0 0   1
chr1 C 10469 CG CG 0.0 0 1
chr1 G 10470 CG CG 0.0 0 8
chr1 C 10471 CG CG 0.0 0 1
chr1 G 10472 CG CG 1.0 8 8

预期输出是,用制表符分隔符分隔:

chr1    C   10469   CG  CG  0.0 0   1
chr1 G 10470 CG CG 0.0 0 8
chr1 C 10471 CG CG 0.0 0 1
chr1 G 10472 CG CG 1.0 8 8

我的代码是:

awk '{a=$2; c=$4; d=$0; e=NR; getline; f=$2; g=$4} {if (a == "C" && f == "G" && c == "CG" && g == "CG") {print d,e,"\n",$0,NR}}' input_file

我使用 getline 并检查下一行是否有“G”。问题是,如果我这样做,awk 将直接转到第三行,并且会错过一些行。例如,输入的第 2 列是:

Line 1: G
Line 2: C
Line 3: G
Line 4: C

预期的输出是第2行和第3行。但是,awk直接从第一行转到第三行,而不是逐行。因此,输出为无。

亲切的问候!

最佳答案

编辑(要将每一行与其下一行进行比较,请使用此行):现在使用 OP 的新示例添加此解决方案。

awk '
FNR>1{
if(secCol=="C" && $2=="G" && fourthCol=="CG" && $4=="CG"){
print prevLine ORS $0
}
}
{
secCol=$2
fourthCol=$4
prevLine=$0
}
' Input_file

说明:为上述内容添加详细说明。

awk '
##Starting awk program from here.
FNR>1{
##Checking condition if current line number is more than 1 then do following.
if(secCol=="C" && $2=="G" && fourthCol=="CG" && $4=="CG"){
##Checking condition if secCol is C AND 2nd column is G AND fourthCol is CG and 4th column is CG then do following.
print prevLine ORS $0
##Printing prevLine ORS and current line.
}
}
{
secCol=$2
##Creating secCol with 2nd column of current line.
fourthCol=$4
##Creating fourthCol with 4th column of current line.
prevLine=$0
##Setting prevLine to current line value.
}
' Input_file ##Mentioning Input_file name here.


初始解决方案(比较每个奇数行和偶数行):(OP 的示例在编辑后变得更加清晰,但也将这个解决方案保留在这里,以供将来的读者使用,以防它有帮助)您能否尝试以下操作,仅按照所示示例编写。这会检查上一行是否有第四列(fourthCol)也是 CG ,以防万一您不需要它,然后从以下内容中删除 && foruthCol=="CG" .

awk '
FNR%2==0{
if(secCol=="C" && $2=="G" && fourthCol=="CG" && $4=="CG"){
print prevLine ORS $0
}
prevLine=secCol=fourthCol=""
next
}
{
secCol=$2
fourthCol=$4
prevLine=$0
}
' Input_file

输出如下。

chr1    C   10469   CG  CG  0.0 0   1
chr1 G 10470 CG CG 0.0 0 8
chr1 C 10471 CG CG 0.0 0 1
chr1 G 10472 CG CG 1.0 8 8

说明:为上述内容添加详细说明。

awk '                          ##Starting awk program from here.
FNR%2==0{ ##Checking condition if line number is divided by 2 or not.
if(secCol=="C" && $2=="G" && fourthCol=="CG" && $4=="CG"){
##Checking condition if secCol is C AND 2nd column is G AND fourthCol is CG and 4th column is CG then do following.
print prevLine ORS $0 ##Printing prevLine ORS and current line.
}
prevLine=secCol=fourthCol="" ##Nullifying prevLone, secCol, fourthCol here.
next ##next will skip all further statements from here.
}
{
secCol=$2 ##Creating secCol with 2nd column of current line.
fourthCol=$4 ##Creating fourthCol with 4th column of current line.
prevLine=$0 ##Setting prevLine to current line value.
}
' Input_file ##Mentioning Input_file name here.

关于awk - 比较 awk 中的当前行和下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65360525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com