Преобразование помеченных данных с одним полем на строку в таблицу с помощью awk - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть файл данных, где каждое поле находится на отдельной строке, как показано ниже.Конкретные поля, которые появляются в записях, различаются, поэтому я не могу использовать какое-либо решение, которое в основном объединяет поля, не зная, что они являются

Пример ввода

Creator=Burroughs Wellcome and Company
Date=ca. 1906
Description=Blue cardboard box, measuring 5.5 cm x 4.3 cm x 2.2 cm. Box in fair condition.
Identifier=77-97.1.3a
DOI=doi:10.6083/M4H41PRC
Medium=Cardboard
Relation=References 77-97.1.3b.jpg
Rights=COPYRIGHT NOT EVALUATED 
Source=Medical Museum Collection, Box 1
Subject=Vaporole;;;Epinine;;;Deoxyepinephrine;;;Pharmaceutical Preparations
Title=Box containing medicine vials
Type=Still Image
collection=2
filename=df0968b22c1072c8909538c516dc81b6.jpg
id=10959

Date=ca. 1906
Description=Two stemmed amber glass vials in a blue cardboard box. 
Identifier=77-97.1.3b
DOI=doi:10.6083/M4CC0Z0M
Medium=Glass;;;Cardboard
Relation=IsPartOf 77-97.1.3a.jpg
Rights=COPYRIGHT NOT EVALUATED
Source=Medical Museum Collection, Box 1
Subject=Vials;;;Vaporole;;;Epinine;;;Deoxyepinephrine;;;Pharmaceutical Preparations
Title=Medicine vials in a box
Type=Still Image
collection=2
filename=9e846a60d8a79de37e91279696e520e6.jpg
id=10960

Iнужно преобразовать это в файл с разделителями.Поскольку поля могут присутствовать или не присутствовать, мне нужно перечислить столбцы для каждой записи, например, заголовок, создатель, дата, идентификатор и т. Д.

Есть ли удобный способ сделать это в awk, или мне нужноприкусить пулю и написать программу?

1 Ответ

0 голосов
/ 04 декабря 2018

Вы не предоставили пример вывода, так что это предположение, но это может быть тем, что вы хотите:

$ cat tst.awk
BEGIN {
    RS   = ""
    FS   = "\n"
    OFS  = ","
    ofmt = "\"%s\"%s"
}
NR == FNR {
    for (i=1; i<=NF; i++) {
        name = $i
        sub(/=.*/,"",name)
        if ( !seen[name]++ ) {
            nr2name[++numNames] = name
        }
    }
    next
}
FNR == 1 {
    for (nameNr=1; nameNr<=numNames; nameNr++) {
        name = nr2name[nameNr]
        printf ofmt, name, (nameNr<numNames ? OFS : ORS)
    }
}
{
    delete name2val
    for (fldNr=1; fldNr<=NF; fldNr++) {
        name = val = $fldNr
        sub(/=.*/,"",name)
        sub(/[^=]+=/,"",val)
        name2val[name] = val
    }

    for (nameNr=1; nameNr<=numNames; nameNr++) {
        name = nr2name[nameNr]
        val  = name2val[name]
        printf ofmt, val, (nameNr<numNames ? OFS : ORS)
    }
}

.

$ awk -f tst.awk file file
"Creator","Date","Description","Identifier","DOI","Medium","Relation","Rights","Source","Subject","Title","Type","collection","filename","id"
"Burroughs Wellcome and Company","ca. 1906","Blue cardboard box, measuring 5.5 cm x 4.3 cm x 2.2 cm. Box in fair condition.","77-97.1.3a","doi:10.6083/M4H41PRC","Cardboard","References 77-97.1.3b.jpg","COPYRIGHT NOT EVALUATED ","Medical Museum Collection, Box 1","Vaporole;;;Epinine;;;Deoxyepinephrine;;;Pharmaceutical Preparations","Box containing medicine vials","Still Image","2","df0968b22c1072c8909538c516dc81b6.jpg","10959"
"","ca. 1906","Two stemmed amber glass vials in a blue cardboard box. ","77-97.1.3b","doi:10.6083/M4CC0Z0M","Glass;;;Cardboard","IsPartOf 77-97.1.3a.jpg","COPYRIGHT NOT EVALUATED","Medical Museum Collection, Box 1","Vials;;;Vaporole;;;Epinine;;;Deoxyepinephrine;;;Pharmaceutical Preparations","Medicine vials in a box","Still Image","2","9e846a60d8a79de37e91279696e520e6.jpg","10960"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...