Linux를 사용한 텍스트 처리

Linux를 사용한 텍스트 처리

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에 항목이 있어야 한다고 가정합니다. 산출.COLORFROMTO

블록은 숫자가 아닌 줄을 건너뜁니다 !/^[0-9]/.

출력의 중복 데이터는 세 번째 블록( )에 의해 선택됩니다 $3 == "". 이 블록은 적절한 값을 가진 문자열을 data생성 합니다. 소수 자릿수 없이 부동 소수점 숫자를 지정하는 형식을 col사용하여 반올림을 수행합니다.sprintf()

최소값과 최대값은 입력 파일의 뒷부분에서 두 번째 열의 최소값과 세 번째 열의 최대값으로 선택됩니다.

END블록은 결과 보고서를 인쇄합니다.

관련 정보