我有一个文件,报告某件事的每个事件及其大小。我试图通过合并连续的事件来总结该信息,这些事件可以通过上面一行的第 3 列与下面一行的第 2 列相同来识别(只要第 1 列相同),输出应该是相同的格式,而不是任何连续字符串的多行,我会将其替换为单行,其中第 2 列将是该列中分组中的最低数字,第 3 列将是该列中分组中的最高数字,第 4 列将是该分组第 4 列中所有数字的平均值(四舍五入到最接近的整数)。
需要明确的是,第一列是特定组,第二列是开始位置,第三列是结束位置,第四列是出现次数。
每行的列组合都是唯一的,列按第 1 列、第 2 列、第 3 列进行预排序。第 2 列中的数字不应该/不会相同,第 3 列中的数字不应该/不会相同是相同的。第一列可以而且通常会是相同的。
如果可能的话,我试图在 awk 中实现这一点,我已经尝试过但失败了。这是我尝试过的:
awk 'BEGIN {OFS=","} NR==1 {print} NR>1 {if ($1==prev && $2==end+1) {sum+=$4; count++; end=$3} else {if (NR>2) {print prev, start, end, int(sum/count+0.5);}; prev=$1; start=$2; end=$3; sum=$4; count=1}} END {print prev, start, end, int(sum/count+0.5)}'
###### reformatted via "awk -o- '...script_body...'"
awk '
BEGIN {
OFS = ","
}
NR == 1 {
print
}
NR > 1 {
if ($1 == prev && $2 == end + 1) {
sum += $4
count++
end = $3
} else {
if (NR > 2) {
print prev, start, end, int(sum / count + 0.5)
}
prev = $1
start = $2
end = $3
sum = $4
count = 1
}
}
END {
print prev, start, end, int(sum / count + 0.5)
}'
输入示例:
fgh1,45513382,45513383,43
fgh1,45513383,45513384,44
fgh1,45513384,45513385,44
fgh1,45513385,45513386,43
fgh1,45513386,45513387,43
fgh1,45513387,45513388,44
fgh2,63543512,63543513,44
fgh2,63543513,63543514,41
fgh2,63543514,63543515,44
fgh2,63543515,63543516,44
输出示例:
fgh1,45513382,45513388,44
fgh2,63543512,63543516,43