첫 번째 열을 헤더로 만들고 쉘 스크립트를 사용하여 해당 값을 나열합니다.

첫 번째 열을 헤더로 만들고 쉘 스크립트를 사용하여 해당 값을 나열합니다.

아래와 같은 내용이 포함된 대용량 파일이 있습니다.

Quantity    20589
Quantity    12297
Quantity    100346
Quantity    0
Quantity    141999
Quantity    23662
Quantity    551071
Quantity    72917
Quantity    60460
Quantity    19712
Quantity    35530
Quantity    0
Quantity    29818
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100

이 파일에서 새 파일을 만들고 싶습니다. 해당 파일의 데이터는 다음과 같아야 합니다.

Quantity,Price,Discount
20589,0,100
12297,0,100    
100346,0,100
0,0,100    
141999,0,100
23662,0,100
551071,0,100
72917,0,100
60460,0,100
19712,0,100
35530,0,100
0,0,100
29818,0,100

즉, 원본 파일을 읽을 때 열 이름은 새 파일의 헤더와 위에 표시된 해당 값이어야 합니다.

쉘 스크립트를 사용하여 새 파일을 작성하도록 도와주세요.

답변1

모든 데이터를 포함하는 대규모 배열을 구축하면 단일 명령 내에서 모든 작업을 수행할 수 있지만 awk파일이 큰 경우 사용 가능한 메모리 문제가 발생할 수 있습니다. 따라서 몇 단계를 거쳐 이 작업을 수행하겠습니다.

header=$(awk '{print $1}' file | uniq | tr '\n' ',')
printf "${header%?}\n" > output
paste -d, <(awk '$1=="Quantity"{print $2}' file) \
          <(awk '$1=="Price"{print $2}' file) \
          <(awk '$1=="Discount"{print $2}' file) >> output

여기서 유일하게 까다로운 부분은 제목 끝의 마지막 쉼표를 제거하는 것입니다. 나는 ${par%?}이것을 위해 생성자를 사용했습니다.

답변2

Perl을 사용하면 이런 식으로 사용할 수 있습니다.

#!/usr/bin/perl

use strict;
use warnings;

my $file=$ARGV[0];

open my $fId, '<', $file or die "Error opeining file <$file>.";

my @qty = ();
my @price = ();
my @discount = ();

while(<$fId>){
    chomp;

    my @fields = split (/\t/, $_);

    push @qty      , $fields[1] if $fields[0] =~ m/Quantity/;
    push @price    , $fields[1] if $fields[0] =~ m/Price/;
    push @discount , $fields[1] if $fields[0] =~ m/Discount/;
}
close $fId;

print "Quantity,Price,Discount\n";
for(my $i = 0; $i < scalar @qty; $i++){
    print "$qty[$i],$price[$i],$discount[$i]\n";
}

파일 이름을 매개변수로 전달해야 합니다.

예: ./test.pl input_file

관련 정보