2014-04-16 2 views
1

기본적으로 파이프로 구분 된 선이있는 파일이 있으므로 특정 길이 이상으로 갈 때 필드의 내용을 자르고 싶습니다. 따라서 최대 길이를 설정했습니다. 각 필드. 모든 그래서gawk에서 입력 데이터의 형식 맵으로 인덱싱 된 배열 사용

gawk -F"|" -- ' 

BEGIN { 
    map[1]=10 
    map[2]=20 
    map[3]=60 
    map[4]=60 
    map[5]=3 
    map[6]=60 
    map[7]=3 

    OFS="|" 
} 

{ 
    for(i = 1; i <= NF; i++) { 
     if (length($i) > map[$i]) { 
     $i = substr($i, 1, map[$i]) 
     } 
    } 
    print; 
} 
' 

여기서 문제는 뭔가 잘못 배열에 있다는 것입니다, 항목이 모두 반환 null 또는 0 : 나는 최대 각 필드에 대한 길이의 값을 저장하기 위해 배열을 사용하고 있습니다 비교 if (length($i) > map[$i])이 true를 반환하면 모든 필드가 비어 있습니다. 배열에 문제가 있습니까?

답변

2

변경 (length($i) > map[$i]) to (length($i) > map[i])substr($i, 1, map[$i]) to substr($i, 1, map[i]). 이처럼

:

gawk -F"|" -- ' 

BEGIN { 
    map[1]=10 
    map[2]=20 
    map[3]=60 
    map[4]=60 
    map[5]=3 
    map[6]=60 
    map[7]=3 

    OFS="|" 
} 

{ 
    for(i = 1; i <= NF; i++) { 
     if (length($i) > map[i]) { 
     $i = substr($i, 1, map[i]) 
     } 
    } 
    print; 
} 
' 

$i는 필드 번호 i의 내용을 의미하지만 필드의 내용은 하지map의 인덱스입니다.

+0

완료되었습니다. 이제 실행하여 볼 수 있습니다 :) thx – JBoy