Awk 및 Grep은 CLI에서 데이터를 가져옵니다.

Awk 및 Grep은 CLI에서 데이터를 가져옵니다.

다음과 같은 출력을 얻고 싶습니다.

Number      Name         Value
*************************************
889900     Staff         256000
990088     Staff         1048576

내 입력은 다음과 같습니다.

%%LST:="889900";%%


Actual                            Service                           Key                              Value 
Staff                             00000001                          350                               256000        
company                           00000002                          360                               1572864       

Total count = 2

There is together 1 report


%%LST:="990088";%%


Actual                            Service                           Key                               Value 
Staff                             00000003                          350                               1048576       
plusmines                         00000004                          120                               20480         
different                         1001                              201                               5120          

Total count = 3

There is together 1 report


%%LST:="112233";%%


Actual                            Service                           Key                               Value 
additional                        00000005                          320                               1048576       
payitoff                          20001                             73710                             1048576       
clubonetwothree                   00000006                          90006280                          1048576       

Total count = 3

There is together 1 report

다음과 같은 코딩을 수행했습니다.

IFS=$'\n'
cat > initial
cat initial | grep "%%LST:=" | awk -F'"' '{print$2}' > x1
cat initial | awk -F' ' '{if ($3 == 350) print $1,$4; else echo "0"}' > x2
rm results2
echo -e "Number       Name                      Value\n*************************************" >> results2
paste x1      x2 | sort -n | expand -t 13 >> results2
cat results2; 
rm initial

"Number"내가 원하는 것은 입력 "%%LST:="과 이름에서 if "Key"is equals= 을 얻고 출력에서 ​​해당 값이 되는 것 350입니다 ."Value""Key"

현재 내 코딩은 모든 항목을 가져와서 정보와 "Number"함께 목록에 붙여넣는 것 입니다 ."Key""Value"

문제는 내 레코드에 레코드가 없으면 "Key" = 350건너뛰거나 빈 공간을 남기지 않는다는 것입니다. 전체 최종 결과에 문제가 발생했습니다.

내가 가지고 있는 관련 정보만 나열하려면 어떤 기능을 사용할 수 있습니까 "Key = 350"?

답변1

#! /usr/bin/awk -f

BEGIN {
    OFS="\t";
    print "Number","Name","Value";
    print "*************************************";
    number="" ; name="" ; value="";
};

/^%%LST/ {
    if (number != "" && name != "" && value != "") { 
        print number, name, value;
        name=""; value="";
    } ;
    number=gensub(/%%LST:=?"([0-9]+)";%%/,"\\1","g") 
} ;

$3 == 350 { 
   name=$1;
   value=$4
};

END {
    if (name != "") {
        print number, name, value
    }
}

remy.awk예를 들어, 실행 가능하게 만들고 chmod +x remy.awk표준 입력 또는 파일 이름(예 ./remy.awk remy.txt: ) 에 데이터를 제공하는 등의 이름으로 저장합니다.

BEGIN {}섹션에서는 출력 필드 구분 기호(OFS)를 탭에 설정한 다음 출력 헤더를 인쇄하고 및 변수 number를 초기화합니다 .namevalue

그런 다음 '%%LST'로 시작하는 행에서 숫자를 추출하고(라는 변수에 넣음 number) 먼저 number비어 있지 않은지 확인합니다. 이미 값이 있는 경우 이전의 세부 정보를 인쇄합니다. name및 변수를 기록하고 지웁니다 value.

키(필드 3)가 350인 행에서 해당 행의 합계를 추출합니다 name.value

마지막으로 블록은 비어 있지 않은 경우 END {}변수를 인쇄하여 최종 레코드(%%LST 줄로 구분)가 Key==350인 레코드인 경우 올바르게 작동하도록 합니다. name이것이 없으면 최종 레코드의 데이터를 인쇄할 수 없습니다.

위의 샘플 데이터를 기반으로 출력은 다음과 같습니다.

$ ./remy.awk remy.txt 
Number  Name    Value
*************************************
889900  Staff   256000
990088  Staff   1048576

관련 정보