处理文本文件以根据另一列的最大值修改列值

问题描述 投票:0回答:1

我有一个要修改的文件。有 100 个文件存在相同问题。输入文件如下

sample1 100A    total   1   1000
sample2 100A    total   1   5584
sample3 100A    total   1   8125
sample4 100A    total   1   59

sample1 .   year    1   1000
sample1 .   week1   20  1001
sample1 .   week2   50  1001

sample2 .   year    1   5584
sample2 .   week1   20  5585
sample2 .   week2   100 5585

sample3 .   year    1   8125
sample3 .   week1   55  8126
sample3 .   week2   100 8126

sample4 .   year    1   59
sample4 .   week1   10  59
sample4 .   week2   8   59

在上面的文件中,第三列中的“总计”是查找表,其最大值不应超过下面各个样本的任何行。

例如,“sample1”的最大值为 1000,但第三列中的“week1”和“week2”的最大值为“1001”。我发现这种情况仅发生在“week1 和 week2”的几行中,并且始终只比最大值大 1。 “week1”和“week2”行的输出应更新为最大值“1000”。下面的示例输出

sample1 100A    total   1   1000
sample2 100A    total   1   5584
sample3 100A    total   1   8125
sample4 100A    total   1   59
                
sample1 .   year    1   1000
sample1 .   week1   20  1000
sample1 .   week2   50  1000
                
sample2 .   year    1   5584
sample2 .   week1   20  5584
sample2 .   week2   100 5584
                
sample3 .   year    1   8125
sample3 .   week1   55  8125
sample3 .   week2   100 8125
                
sample4 .   year    1   59
sample4 .   week1   10  59
sample4 .   week2   8   59

请为我提供指导,告诉我应该如何进行。我是一名初学者程序员,希望学习。谢谢你的帮助

python unix awk
1个回答
0
投票

这适用于您的用例吗?

awk '/total/ {a[$1] = $5; print} !/total/ {print $1, $2, $3, $4, ($5 > a[$1] ? a[$1] : $5)}' input_file.txt

例如

cat input_file.txt
sample1 100A    total   1   1000
sample2 100A    total   1   5584
sample3 100A    total   1   8125
sample4 100A    total   1   59

sample1 .   year    1   1000
sample1 .   week1   20  1001
sample1 .   week2   50  1001

sample2 .   year    1   5584
sample2 .   week1   20  5585
sample2 .   week2   100 5585

sample3 .   year    1   8125
sample3 .   week1   55  8126
sample3 .   week2   100 8126

sample4 .   year    1   59
sample4 .   week1   10  59
sample4 .   week2   8   59

awk '/total/ {a[$1] = $5; print} !/total/ {print $1, $2, $3, $4, ($5 > a[$1] ? a[$1] : $5)}' input_file.txt
sample1 100A    total   1   1000
sample2 100A    total   1   5584
sample3 100A    total   1   8125
sample4 100A    total   1   59

sample1 . year 1 1000
sample1 . week1 20 1000
sample1 . week2 50 1000

sample2 . year 1 5584
sample2 . week1 20 5584
sample2 . week2 100 5584

sample3 . year 1 8125
sample3 . week1 55 8125
sample3 . week2 100 8125

sample4 . year 1 59
sample4 . week1 10 59
sample4 . week2 8 59
© www.soinside.com 2019 - 2024. All rights reserved.