2016-06-30 5 views
0

awk를 사용하여 여러 유형의 값 (예 : 두 번째 소수점 이하의 모든 값을 반올림)을 사용하여 .csv 파일을 편집하고 싶습니다. 다른 행에도 float 값이 포함될 수 있지만 다른 행은 다른 방식으로 처리됩니다.awk를 사용하여 csv 파일의 여러 열을 편집하는 방법

한 행이 아래의 것과 같다고 가정하면 7 번, 8 번, 9 번 열을 편집하고 싶습니다. (실제로는 더 길지만 값의 모든 관련 유형이이 문제에 포함됩니다. 규모) :

L ,P_005 ,250.092 ,20.0 ,-0.80 ,0.803443 ,0.23342 ,0.83728329 ,0.0 ,0.0 

는 출력해야

L ,P_005 , 250.092, 20.0, -0.80, 0.80, 0.23, 0.84, 0.0, E2=0.0 

최대 이제했습니다 항상 사용하여 하나 개의 컬럼 "X"의 값 라운드 :

#/bin/sh 
OLDIFS=$IFS 
IFS = "," 
file=$1 
... 
awk '{printf "%.2f",$x}' $1 
... 
IFS=$OLDIFS 
나는 길에이 개념을 적용 어떻게 그래서

어디 수

  • 편집 여러 열 및
  • 표시 특정 옵션으로 각 열을 작성하지 않고도 전체 CSV 파일

? 나는 당신의 guestion 권리를 가지고있는 경우

+3

간결하고 테스트 가능한 샘플 입력 및 예상 출력을 포함하는 [mcve]를 포함하는 질문. 스크립트, 입력 및 출력에'{}'편집기 버튼을 사용하십시오. 현재 사용하고있는 스크립트가 awk 구문과 틀린 것은 아닙니다. 우리에게 한 가지를 보여주고 그 질문을 난처하게하고 우리가 당신을 도우려고하는 것을 어렵게 만듭니다. –

+0

조언 해 주셔서 감사합니다. 편집 내용이 요구 사항에 부합되기를 바랍니다 – krouch

+0

샘플 입력/출력의 한 줄을 게시하면 그 한 줄의 입력에서만 작동하는 솔루션을 얻을 수 있습니다. 자신의 질문에 더 많은 노력을 기울일수록 (예 : 비오는 날 및/또는 사용자가 입력으로 예상 할 수있는 엣지 사례 포함) 강력한 솔루션을 얻을 가능성이 높습니다. –

답변

1

는 :

awk -F\; -v OFS=\; ' 
function foo(str) { 
    if(match(str, /[0-9]+\.[0-9]+/, arr)) { 
    gsub(/[0-9]+\.[0-9]+/, sprintf("%.2f",arr[0]), str) 
    } 
    return str 
} 
{ 
    for(i=1; i<=NF; i++) 
    printf "%s%s", foo($i),(i<NF?OFS:ORS) 
}' test.in 

그것은 생산 :

L;P_005;X 250; Y 20; Z 0; A 0.80; B 0.23; C 0.84; E1=0.00; E2=0.00 , 

합니다.

+0

정규 표현식에서'+'를'{2,}'로 변경하면 원하는 출력 형식 인'L; P_005; X 250; Y20; Z 0; 0.803443; B 0.23342; C 0.83728329; E1 = 0.0; E2 = 0.0,' – karakfa

+0

당신은 match()에 대한 3 번째 arg 때문에 GNU awk에서만 작동한다고 언급해야합니다. 더 중요한 것은 게시 된 샘플 입력에 대해 작동하지만 다른 잠재적 입력에 대해서는 실패하는 스크립트의 좋은 예입니다. 'P_005'를'P_00.5'로 바꾸면'P_0.50'으로 출력됩니다. –

관련 문제