csv 파일에서 부분 데이터를 읽고 다음 패턴으로 텍스트 파일에 쓰는 Linux 프로그램을 작성해야 합니다.
NAME : FROM= -100 -346 -249 -125 TO= -346 -249 -125 100 COLOR= COLOR1 COLOR2 COLOR3 COLOR4
NAME은 고정 행이 됩니다.
FROM 및 TO 정보는 csv 파일에서 검색되어야 하며,
색상 정보는 프로그램 자체에서 하드코딩된 색상 배열일 수 있습니다.
아래 csv 데이터에서 MIN(-100) 아래의 첫 번째 값은 텍스트 파일의 FROM 아래 첫 번째 값(-100)이 됩니다. Excel MAX 열의 마지막 값(100)은 텍스트 파일의 TO 열 아래의 마지막 값(100)이 됩니다. Excel의 VALUE 열 아래 값은 반올림되어 표시된 각 패턴에 대해 TO 및 FROM으로 사용됩니다.
데이터, 가치, 100,-345.8756, 200,-249.3654, 300,-125.3554, 개수, 최소, 최대 1,-100,-98 93,84,86 98,94,96 99,96,98 100,98,100
답변1
앗해결 방법(현재 입력 파일의 경우):
awk 'NR>1 && NR<5{
v=sprintf("%.0f", $2); values=(values)? values FS v : v;
lbl="COLOR"; col_item=lbl""++c; col=(col)? col OFS col_item : col_item
}
NR==6{ from=$2 }
END{
print "NAME :"; print "FROM=",from,values;
print "TO=",values,$3; print "COLOR=",col,lbl""++c
}' file
산출:
NAME :
FROM= -100 -346 -249 -125
TO= -346 -249 -125 100
COLOR= COLOR1 COLOR2 COLOR3 COLOR4
답변2
프로그램 awk
:
BEGIN { FS = ","; col = "COLOR1"; i = 1 }
!/^[0-9]/ { next }
$3 == "" {
val = sprintf("%.0f", $2)
data = data ? data OFS val : val
col = col OFS "COLOR" ++i
next
}
$2 < min { min = $2 }
$3 > max { max = $3 }
END {
printf("NAME:\nFROM= %s %s\nTO= %s %s\nCOLOR= %s\n",
min, data, data, max, col)
}
테스트해보세요:
$ awk -f script.awk file.csv
NAME:
FROM= -100 -346 -249 -125
TO= -346 -249 -125 100
COLOR= COLOR1 COLOR2 COLOR3 COLOR4
파일의 첫 번째 부분과 두 번째 부분에 더 많은 데이터 행(열은 아님)이 있을 수 있고 파일에 있는 데이터 값 과 행 수만큼 행 COLOR
에 항목이 있어야 한다고 가정합니다. 산출.COLOR
FROM
TO
블록은 숫자가 아닌 줄을 건너뜁니다 !/^[0-9]/
.
출력의 중복 데이터는 세 번째 블록( )에 의해 선택됩니다 $3 == ""
. 이 블록은 적절한 값을 가진 문자열을 data
생성 합니다. 소수 자릿수 없이 부동 소수점 숫자를 지정하는 형식을 col
사용하여 반올림을 수행합니다.sprintf()
최소값과 최대값은 입력 파일의 뒷부분에서 두 번째 열의 최소값과 세 번째 열의 최대값으로 선택됩니다.
이 END
블록은 결과 보고서를 인쇄합니다.