【问题标题】:awk or other shell to convert delimited list into a tableawk 或其他 shell 将分隔列表转换为表格
【发布时间】: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 来操作文本的工具。

标签: shell awk


【解决方案1】:

您可以简单地使用 assoc 数组:awk -F, -f parse.awk input.csvparse.awk 是:

{
    sub(/Event/, "", $3);
    res[$1","$2][$3]=$4;
}

END {
    for (name in res) {
        printf("%s,%s,%s,%s,%s\n", name, res[name][1], res[name][2], res[name][3], res[name][4])
    }
}

顺序可能会被 awk 混淆,但我的测试输出是:

Pool2,Shard1,,,50,
Pool1,Shard1,10,20,,
Pool1,Shard2,30,,,40

PS:请使用编辑器编写 awk 源代码。你的单行字真的很难读。由于我使用了不同的方法,我什至没有尝试让它“正确”... ;)

【讨论】:

  • 您应该提到,对于数组的数组需要 GNU awk。
【解决方案2】:
$ cat tst.awk
BEGIN { FS=OFS="," }
{ key = $1 OFS $2 }
key != prev {
    if ( NR>1 ) {
        print prev, f["Event1"], f["Event2"], f["Event3"], f["Event4"]
        delete f
    }
    prev = key
}
{ f[$3] = $4 }
END { print key, f["Event1"], f["Event2"], f["Event3"], f["Event4"] }

$ sort file | awk -f tst.awk
Pool1,Shard1,10,20,,
Pool1,Shard2,30,,,40
Pool2,Shard1,,,50,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多