gpt4 book ai didi

linux - 如何使用 if/else awk 评估文件并提取此信息?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:04 25 4
gpt4 key购买 nike

我有这样一个文件:

419 I     0.3529
420 S 0.3182
421 T 0.3740
422 Y 0.3872
423 I 0.3460
424 E 0.4409
425 S 0.3182
426 T 0.3740
427 Y 0.4141
428 I 0.3460
429 S 0.3131
430 Y 0.3838
431 T 0.3939
432 S 0.3101

我正在尝试编写一个 Awk 程序来评估第三列中大于或等于 0.4 的数字。如果为真,则在该字母(第二列)中向上取 4 个字符,向下取 4 个字符。如果有多个匹配项,我希望每个匹配项都有一个固定长度的字符串:

STYIESTYI
IESTYISYT

第一个出现是因为在第 424 行有一个匹配项;第二个是第 427 行的(部分重叠)匹配项。我将如何处理这个问题?

最佳答案

$ cat tst.awk
BEGIN {
tgt = (tgt=="" ? 0.4 : tgt)
cxt = (cxt=="" ? 4 : cxt)
bef = (bef=="" ? cxt : bef)
aft = (aft=="" ? cxt : aft)
}
$3 >= tgt { hits[++numHits] = NR }
{ chars[NR] = $2 }
END {
for (hitNr=1; hitNr<=numHits; hitNr++) {
for (lineNr=(hits[hitNr]-bef); lineNr<=(hits[hitNr]+aft); lineNr++) {
printf "%s", (lineNr in chars ? chars[lineNr] : "")
}
print ""
}
}

$ awk -f tst.awk file
STYIESTYI
IESTYISYT

请注意,如果第 3 个字段 >= 0.4 的行距文件的开头和/或结尾的距离小于 4 行,这将表现得很好 - 确保使用任何可能的答案测试这些条件,因为它们经常下雨提供潜在解决方案的人经常忘记涵盖此类问题的日常案例。

例如,使用此输入文件尝试所有可能的解决方案,看看是否获得预期的输出:

$ cat file1
421 T 0.3740
422 Y 0.3872
423 I 0.3460
424 E 0.4409
425 S 0.3182
426 T 0.3740
427 Y 0.4141
428 I 0.3460
429 S 0.3131
430 Y 0.3838

$ awk -f tst.awk file1
TYIESTYI
IESTYISY

或者如果您缺少输出行或带有前导/尾随空白或其他不需要的字符或其他内容的行。

另请注意,您可以将目标值从 0.4 更改为其他值,并且只需设置命令行参数,即可更改要在匹配行之前和/或之后打印的上下文行数,例如

在 0.37 之前和之后打印 5 行上下文:

$ awk -v tgt=0.37 -v cxt=5 -f tst.awk file
ISTYIEST
ISTYIESTY
ISTYIESTYIS
TYIESTYISYT
YIESTYISYTS
STYISYTS
TYISYTS

打印 0.34 之前的 1 行和之后的 2 行:

$ awk -v tgt=0.34 -v bef=1 -v aft=2 -f tst.awk file
IST
STYI
TYIE
YIES
IEST
STYI
TYIS
YISY
SYTS
YTS

关于linux - 如何使用 if/else awk 评估文件并提取此信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34312450/

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