>

파일의 내용이 아래와 같습니다 :-

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

    펄로 당신은 이런 식으로 할 수 있습니다,

    #!/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

관련 자료

  • 이전 xorg - xorg의 키보드 레이아웃을 시각적으로 표시합니까?/또한 - xorg 키보드 레이아웃은 어디에서 왔습니까?
  • 다음 bash - 함수 나 스크립트에서 * 실제 * (해석되지 않은) 셸 인수를 얻는 방법이 있습니까?