
다음과 같은 출력을 얻고 싶습니다.
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
를 초기화합니다 .name
value
그런 다음 '%%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