我已经对此进行了多次尝试,但显然遗漏了一些东西并且需要帮助。
我有一个包含数千行信息的大表,我试图根据第 3、4 和 6 列将它们分类。我已经按这些列对行进行了排序,现在只想执行以下操作:
如果第 3 列=前几行第 3 列 && 第 4 列 < 前几行第 5 列 && 第 6 列 = 前几行第 6 列;然后打印该行,但用第一个出现的匹配的行号修改开头;否则打印该行但修改当前行号的开头
这是我的糟糕方法,充满了错误:
awk -F, 'BEGIN { OFS = FS } {if ($4<prev5 && $3==prev3 && $6==prev6) print Marker,$0;else Marker=NR print NR,$0; prev5=$5; prev3=$3; prev6=$6}'
输入示例(为了便于查看,以逗号分隔):
a,b,2,15,50,ABBA
a,a,2,26,55,ABBA
b,a,2,80,99,ABA
c,a,3,20,40,CAN
a,b,3,51,300.CAN
a,a,4,1000,2000,ART
d,c,4,1700,2050,ART
b,a,4,1800,2051,ART
输出示例:
1,a,b,2,15,50,ABBA
1,a,a,2,26,55,ABBA
3,b,a,2,80,99,ABA
4,c,a,3,20,40,CAN
5,a,b,3,51,300.CAN
6,a,4,1000,2000,ART
6,c,4,1700,2050,ART
6,b,a,4,1800,2051,ART
我只是想按给定的标准对这些行进行分组,因此组标识符不需要使用我建议的行号方法,如果有更好的方法可以做到这一点。
我真的希望有人可以帮助解决这个问题,因为我总是热衷于改进我所知道的基本代码,所以如果可能的话,也请提供解释,因为我想从我的错误中学习!
答案1
您可以通过将代码分散在几行中来使其更具可读性:
awk -F, '
BEGIN { OFS = FS }
# Each line
{
if($3 == prev[3] && $4 < prev[5] && $6 == prev[6])
{
# Capture and use record number of last match
if(!nrMatched) { nrMatched = NR-1 }
print nrMatched, $0
}
else
{
# No match, reset matched flag and just copy record through
nrMatched = 0
print NR, $0
}
# Save fields from this line for next comparison
split($0, prev)
}
' datafile
输出
1,a,b,2,15,50,ABBA
1,a,a,2,26,55,ABBA
3,b,a,2,80,99,ABA
4,c,a,3,20,40,CAN
5,a,b,3,51,300.CAN
6,a,a,4,1000,2000,ART
6,d,c,4,1700,2050,ART
6,b,a,4,1800,2051,ART