일반 텍스트 정보를 csv 또는 Excel로 변환

일반 텍스트 정보를 csv 또는 Excel로 변환

비슷한 데이터가 포함된 파일이 있는데 비슷한 방식으로 정리하려고 합니다. 자세한 내용은 다음과 같습니다. 컨텍스트의 변수를 기반으로 스크립트를 수정했는데 원하는 결과를 얻을 수 없었습니다. 아마도 awk에 대한 지식이 부족하고 스크립팅에 대한 지식이 부족하기 때문일 것입니다.

Virtual_Machine  OL6U6  
Vdisk  0004fb00001200005e2ca2d2c7fc2d6f.img size 46GB
Vdisk  0004fb0000120000597ab28f2b6493f8.img size 51GB
Vdisk  0004fb00001200003edc9a2ae9cd5aa6.img size 31GB
Physical_Disk  IBM (796)
device /dev/mapper/dm-0
shareddisk true
Physical_Disk  IBM (829)
device /dev/mapper/dm-1
shareddisk true
Physical_Disk  IBM (830)
device /dev/mapper/dm-2
shareddisk true
Physical_Disk  IBM (742)
device /dev/mapper/dm-3
shareddisk true

아래 형식으로 가져오려고 합니다. 여기에는 두 가지 조건이 있습니다. M = 물리적 디스크 수 N = V 디스크 수 M > N인 경우 Virtual_Machine의 행 수 = M M < N인 경우 Virtual_Machine의 행 수 = N

Virtual Machine      Vdisk                                     size           Physical_Disk    device              shareddisk
OL6U6               0004fb00001200005e2ca2d2c7fc2d6f.img       46GB           IBM (796)        /dev/mapper/dm-0     true
OL6U6               0004fb0000120000597ab28f2b6493f8.img       51GB           IBM (829)        /dev/mapper/dm-1     true
OL6U6               0004fb00001200003edc9a2ae9cd5aa6.img       31GB           IBM (830)        /dev/mapper/dm-2     true
OL6U6               -                                         -              IBM (742)         /dev/mapper/dm-2     true

조언해주세요.

감사합니다, 다르샨

답변1

책 제목, 연도 및 논문의 배열을 유지 관리하여 awk를 사용하여 이를 수행할 수 있습니다. 귀하의 예에서는 논문에 연도가 없으므로 두 번째 열에 제목으로만 나열됩니다.

예는 다음과 같습니다.

#!/usr/bin/awk -f
function finish() {
    rows = book;
    if (rows < paper) rows = paper;
    for (n = 0; n <= rows; ++n) {
            printf "%-15s %-25s %-8s %s\n",
            author,
            n <= book ? books[n] : "-",
            n <= book ? years[n] : "-",
            n <= paper ? papers[n] : "-";
    }
    book = -1;
    paper = -1;
}
BEGIN {
    author = "?";
    book = -1;
    paper = -1;
    printf "Author          Books                     year     Papers\n";
}
/^[[:space:]]*Author[[:space:]]/ {
    finish();
    author = $0;
    sub("^[^[:space:]]+[[:space:]]+", "", author);
    sub("[[:space:]]+$", "", author);
    next;
}
/^[[:space:]]*(e)?paper[[:space:]]/ {
    ++paper;
    item = $0;
    sub("^[^[:space:]]+[[:space:]]+", "", item);
    sub("[[:space:]]+$", "", item);
    papers[paper] = item;
    next;
}
/^[[:space:]]*([eE])?[bB]ook[[:space:]].*year[[:space:]]+[[:digit:]]+[[:space:]]*$/ {
    ++book;
    item = $0;
    sub("^[^[:space:]]*[[:space:]]*", "", item);
    sub("[[:space:]]+$", "", item);
    title = item;
    sub("[[:space:]]*year[[:space:]]+[[:digit:]]+$", "", title);
    year = item;
    sub("^.*year[[:space:]]+", "", year);
    books[book] = title;
    years[book] = year;
    next;
}
END {
    finish();
}

출력:

$ ./foo <foo.in
Author          Books                     year     Papers
E. Narayanan    Astrophysics              2001     Intelligent Transportation
E. Narayanan    General Mechanics         2010     Nanotechnology Magazine
E. Narayanan    Nuclear physics           2011     -
R Ramesh        Organic Chemistry         2007     Ionic Batteries
R Ramesh        Physical chemistry        2008     solar photocatalytic oxidation processes
R Ramesh        -                         -        Biological oxidation

관련 정보