【发布时间】:2021-04-29 15:27:04
【问题描述】:
所以我有一个类似这样的巨大 csv:
Pool1,Shard1,Event1,10
Pool1,Shard1,Event2,20
Pool1,Shard2,Event1,30
Pool1,Shard2,Event4,40
Pool2,Shard1,Event3,50
等
这不是易读的。要么只有 4 种类型的事件,我使用电子表格将其转换为以下内容:
Pool1,Shard1,10,20,,
Pool1,Shard2,30,,,40
Pool2,Shard1,,,50,
只有事件被限制为 4 个,池和分片实际上可以是无限的。但是这些事件可能会从行中丢失 - 并非所有池/分片每天都有所有 4 个事件。
所以我尝试在最初收集 csv 的 shell 脚本中的 awk 中执行此操作,但我失败了,甚至无法显示任何工作代码,因为它产生的结果为零。
基本上,我尝试对读取一行的前两个字段的 CSV 进行排序,与前一行进行比较,如果匹配,则将第三个字段与一组事件字符串进行比较,然后将第四个字段存储在与事件相关的变量中,并且一个前两个文件不匹配 - 最后打印包括变量在内的整行。
对不起,单行,直接在命令行中进行测试和实验。很尴尬,什么都没做。
awk -F, '{if (a==$1&&b==$2) {if ($3=="Event1") {r=$4} ; if ($3=="Event2") {d=$4} ; if ($3=="Event3") {t=$4} ; if ($3=="Event4") {p=$4}} else {printf $a","$b","$r","$d","$p","$t"\n"; a=$1 ; b=$2 ; if ($3=="Event1") {r=$4} ; if ($3=="Event2") {d=$4} ; if ($3=="Event3") {t=$4} ; if ($3=="Event4") {p=$4} ; a=$1; b=$2}} END {printf "\n"}'
【问题讨论】:
-
awk 不是外壳。 shell 是一种工具,用于创建/销毁文件和进程以及对工具的顺序调用以执行任务。 awk 是发明 shell 的人也发明的用于调用 shell 来操作文本的工具。