优雅的解析和一个巨大的文本标签

2024-09-30 03:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的表,表中有三列标签,分别是对汉堡的深入分析。 这是表格的一小部分(对不起分隔符)

NAME@FEATURE@DESCRIPTION
Kburger@supplier@Jackobs12
Kburger@type@Minkins Carnivorous
Kburger@deposit@http://minkins.sord/deposit/Kburger
Kburger@opinions@shitty::very gummy|shitty::grey
Kburger@code@HB3T2323|Tried just once; IT IS: disgusting…
Aburger@supplier@Mark11
Aburger@type@Minkins Carnivorous
Aburger@deposit@http://minkins.sord/deposit/Aburger
Aburger@opinions@shitty::very gummy
Cburger@supplier@David22
Cburger@type@Minkins Carnivorous
Cburger@deposit@http://minkins.sord/deposit/Cburger
Cburger@opinions@shitty::very gummy|slightly hard::never again
Dburger@supplier@Jason99
Dburger@type@Minkins Carnivorous
Dburger@deposit@http://minkins.sord/deposit/Dburger
Dburger@opinions@shitty::very gummy
Eburger@supplier@CarlX
Eburger@type@Minkins Vegetarian
Eburger@deposit@http://minkins.sord/deposit/Eburger
Eburger@opinions@shitty::very gummy|shitty::abnormal
Fburger@supplier@Dino12
Fburger@type@Minkins Vegetarian
Fburger@deposit@http://minkins.sord/deposit/Fburger
Fburger@opinions@shitty::very gummy
Fburger@code@HB3T5554|Reminds me about vomit (N3VER); MEMORIES: No other comments...

如您所见,对于一些汉堡名称,我们有5个特性而不是4个,显示“代码”特性(总是以HB开头),在许多情况下,它是缺失的。我想用R解析这个表,得到一个3列tab分隔的摘要表,其中包含一行代码、名称和观点,如下所示:

CODE    NAME    DESCRIPTION
HB3T2323    Kburger shitty::very gummy|shitty::grey
HB3T5554    Fburger shitty::very gummy

这是我在bash中的粗略解决方案,我真的很惭愧:

cat table.txt  | tr '@' '\t' | grep "HB" | cut -d '|' -f1,3 | cut -f1,3 | while read i; do echo $(echo $i | awk '{print $2}') && grep $(echo $i | awk '{print $1}') table.txt | grep "opinions" ; done  | tr '@' '\t' | paste - - | cut -f1,2,4 > new_table.txt

如果你也能用bash或python提供一个解决方案,我也会很感激,但老实说,我更喜欢R


Tags: httptypeverysupplierdepositshittygummyopinions
1条回答
网友
1楼 · 发布于 2024-09-30 03:22:47

下面是一个使用dplyr和tidyr包的潜在R解决方案

library(tidyr)
library(dplyr)

df <- read.delim(file = "PATH/TO/TAB/DELIMITED/FILE/HERE.txt")

df <- df %>%
      spread(key = "FEATURE", value = "DESCRIPTION") %>%
      separate(col = "code", into = c("code", "code_desc"), sep = "\\|", extra = "merge", fill = "right") %>%
      filter(!is.na(code)) %>%
      select("CODE" = code, NAME, "DESCRIPTION" = opinions)

write.table(df, "PATH/TO/TAB/DELIMITED/OUTPUT/FILE/HERE.txt", sep = "\t", na = "", row.names = FALSE)

相关问题 更多 >

    热门问题