我面临一个比我更大的问题。我有 18 个相对较大的文本文件(每个大约 30k 行),我需要计算第二列中空单元格之间的值。这是我的文件的一个简单示例:
Metabolism
line_1 10.2
line_2 10.1
line_3 10.3
TCA_cycle
line_4 10.7
line_5 10.8
Pyruvate_metab
line_6 100.8
Run Code Online (Sandbox Code Playgroud)
实际上,我有大约 500 条描述行(代谢、TCA_cycle 等),行的范围在零到几百之间。
我想计算每个块的值(块以描述开头,对应的行总是在下面),例如
Metabolism 30.6
line_1 10.2
line_2 10.1
line_3 10.3
TCA_cycle 21.5
line_4 10.7
line_5 10.8
Pyruvate_metab 100.8
line_6 100.8
Run Code Online (Sandbox Code Playgroud)
要不就
30.3
21.5
100.8
Run Code Online (Sandbox Code Playgroud)
如果将结果逐行打印到附加文件中,那不会有问题……或者其他替代方法。
有一件棘手的事情,它是没有数字行的描述。
Transport
line_1000 100.1
line_1001 100.2
Cell_signal
Motility
Processing
Translation
line_1002 500.1
line_1003 200.2
Run Code Online (Sandbox Code Playgroud)
甚至对于那些行并希望获得 0 值。
Transport 200.3
line_1000 100.1
line_1001 100.2
Cell_signal 0
Motility 0
Processing 0
Translation 700.3
line_1002 500.1
line_1003 200.2
Run Code Online (Sandbox Code Playgroud)
文件的其余部分看起来相同且一致 - 2 列,制表符分隔符,第一列中的描述,第二列中的值,没有空格(只有下划线)。
实际上我没有更复杂的编码经验,所以我真的不知道如何在命令行中解决它。我已经尝试了一些 Excel 方法,但它很痛苦而且没有成功。
与tac
任何awk
:
tac file | awk 'NF==2{sum+=$2; print; next} {print $1 "\t" sum; sum=0}' | tac
Run Code Online (Sandbox Code Playgroud)
kvantour和Ed Morton提出了两项改进。看评论。
tac file | awk '($NF+0==$NF){sum+=$2; print; next} {print $1 "\t" sum+0; sum=0}' | tac
Run Code Online (Sandbox Code Playgroud)
请参阅:8 个强大的 Awk 内置变量——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR
归档时间: |
|
查看次数: |
144 次 |
最近记录: |