2012-03-18 4 views
1

내 데이터는 열 2에 90이 있고 위의 두 행에는 열 2의 값이 변경됩니다. 예를 들어 아래 데이터를 보면 90 11 행에서 9 행 11에서 5로 제 2 열의 값을 변경하고 싶습니다. 숫자를 변경하려는 값이 미리 설정되어 있습니다. 값은 항상 10,11,12,30,31,32에서 1,2,3,4,5,6까지입니다. 내가gawk를 사용하여 특정 열을 특정 값으로 바꾼다

#  Type Response  Acc  RT  Offset  
    1  70 0 0 0.0000 57850 
    2  31 0 0 0.0000 59371 
    3  41 0 0 0.0000 60909 
    4  70 0 0 0.0000 61478 
    5  31 0 0 0.0000 62999 
    6  41 0 0 0.0000 64537 
    8  70 0 0 0.0000 65106 
    9  5 0 0 0.0000 66627 
    10  21 0 0 0.0000 68165 
    11  90 0 0 0.0000 68700 
    12  31 0 0 0.0000 70221 

내가 이전 행을 저장하고 참고 자료로 것을 사용하려고 시도되었지만 난 단지 다시 한 줄을 갈 수를 원하고, 내가 필요로 무엇

내 데이터

#  Type Response  Acc  RT  Offset  
    1  70 0 0 0.0000 57850 
    2  31 0 0 0.0000 59371 
    3  41 0 0 0.0000 60909 
    4  70 0 0 0.0000 61478 
    5  31 0 0 0.0000 62999 
    6  41 0 0 0.0000 64537 
    8  70 0 0 0.0000 65106 
    9  11 0 0 0.0000 66627 
    10  21 0 0 0.0000 68165 
    11  90 0 0 0.0000 68700 
    12  31 0 0 0.0000 70221 

둘로 돌아가. 도와 줘서 고마워.

+0

번역 시퀀스'10,11,12,30,31,32', 6 '은'11 '을'5 '로 변경하라는 요구와 일치하지 않습니다. –

답변

1

이 작동합니다 :

function pra(a) { 
    for(e in a) { 
    printf "%s ", a[e]; 
    } 
    print ""; 
} 
BEGIN { 
    vals[10] = 1; 
    vals[11] = 2; 
    vals[12] = 3; 
    vals[30] = 4; 
    vals[31] = 5; 
    vals[32] = 6; 
} 
NR == 1 { split($0, a, " ") } 
NR == 2 { split($0, b, " ") } 
NR > 2 { 
    if($2 == "90") { 
    a[2] = vals[a[2]]; 
    } 
    pra(a); 
    al = 0; 
    for(i in a) al++; 
    for(i = 1; i <= al; i++) { 
    a[i] = b[i]; 
    } 
    split($0, b, " "); 
} 
END { 
    pra(a); 
    pra(b); 
} 

이 작동하는 방법의 개요를 : * 한 beging 블록 - 기억 처음 두 행 - vals * NR == 1과 NR의 == 2가 번역 값을 할당 분할 어레이 ab * NR> 2로 - 모든 라인 이후의 처음 두 번째 열의 값 90있는 경우, 번역 배열 *가 a에 배열 b 요소를 이동하여 변경 및 C 분할 * b 에 urrent 라인 * END 블록 - 기본적으로 마지막 두 줄 수 있습니다 ab, 인쇄

샘플 실행 :

$ cat inp && awk -f mkt.awk inp 
#  Type Response  Acc  RT  Offset  
    1  70 0 0 0.0000 57850 
    2  31 0 0 0.0000 59371 
    3  41 0 0 0.0000 60909 
    4  70 0 0 0.0000 61478 
    5  31 0 0 0.0000 62999 
    6  41 0 0 0.0000 64537 
    8  70 0 0 0.0000 65106 
    9  11 0 0 0.0000 66627 
    10  21 0 0 0.0000 68165 
    11  90 0 0 0.0000 68700 
    12  31 0 0 0.0000 70221 

# Type Response Acc RT Offset 
1 70 0 0 0.0000 57850 
2 31 0 0 0.0000 59371 
3 41 0 0 0.0000 60909 
4 70 0 0 0.0000 61478 
5 31 0 0 0.0000 62999 
6 41 0 0 0.0000 64537 
8 70 0 0 0.0000 65106 
9 2 0 0 0.0000 66627 
10 21 0 0 0.0000 68165 
11 90 0 0 0.0000 68700 
12 31 0 0 0.0000 70221 

당신은 같은 것을 할 수 있습니다

function pra(a) { 
    printf "%4d%8d%3d%5d%9.4f%6d\n", a[1], a[2], a[3], a[4], a[5], a[6] 
} 
BEGIN { 
    vals[10] = 1; 
    vals[11] = 2; 
    vals[12] = 3; 
    vals[30] = 4; 
    vals[31] = 5; 
    vals[32] = 6; 
} 
NR == 1 { print } 
NR == 2 { split($0, a, " ") } 
NR == 3 { split($0, b, " ") } 
NR > 4 { 
    if($2 == "90") { 
    a[2] = vals[a[2]]; 
    } 
    pra(a); 
    for(i = 1; i <= 6; i++) { 
    a[i] = b[i]; 
    } 
    split($0, b, " "); 
} 
END { 
    pra(a); 
    pra(b); 
} 

것은 만들려면 형식 지정을 포함하는이 특정 경우에 작동합니다. 샘플 실행 :

$ cat inp && awk -f mkt.awk inp 
#  Type Response  Acc  RT  Offset  
    1  70 0 0 0.0000 57850 
    2  31 0 0 0.0000 59371 
    3  41 0 0 0.0000 60909 
    4  70 0 0 0.0000 61478 
    5  31 0 0 0.0000 62999 
    6  41 0 0 0.0000 64537 
    8  70 0 0 0.0000 65106 
    9  11 0 0 0.0000 66627 
    10  21 0 0 0.0000 68165 
    11  90 0 0 0.0000 68700 
    12  31 0 0 0.0000 70221 
#  Type Response  Acc  RT  Offset  
    1  70 0 0 0.0000 57850 
    2  31 0 0 0.0000 59371 
    4  70 0 0 0.0000 61478 
    5  31 0 0 0.0000 62999 
    6  41 0 0 0.0000 64537 
    8  70 0 0 0.0000 65106 
    9  2 0 0 0.0000 66627 
    10  21 0 0 0.0000 68165 
    11  90 0 0 0.0000 68700 
    12  31 0 0 0.0000 70221 
+0

와우 너무 빨리 답장 해 주셔서 감사합니다. 귀하의 코드를 시도해 보았습니다. 위에서 설명한대로 데이터의 형식을 유지할 수 있습니까? 귀하의 코드를 실행했을 때 데이터와 헤더가 재 배열 된 결과를 보냈습니다 (Acc RT Offset # 유형 응답 0 0.0000 43991 1 55 0). 또한, 코드 실행 방법에 대한 분석을 제공 할 수 있습니까? 또한 대단히 감사합니다. – user1269741

+0

감사합니다. 편집을 참조하십시오. –

+0

주 : 해당 필드가 '10,11,12,30,31,32' 목록에서 ** 아닙니다 ** 일 때 잘못된 대체를합니다 ... 그 번호가 '0'으로 바뀝니다. 그는 주어진 목록에 확실한 대체물이 있다고 언급하지만 목록에 유일한 값이 들어 있다는 것을 의미하는지 확실하지 않습니다 ... (다른 값이있을 수 있다면 언급할만한 가치가 있습니다). –

0

이 버전은 유지`1,2,3,4,5로 원래 서식

awk 'BEGIN{ new[" 1"]="10"; new[" 2"]="11"; new[" 3"]="12" 
      new[" 4"]="30"; new[" 5"]="31"; new[" 6"]="32" } 
    { line[-2]=line[-1]; line[-1]=line[0]; line[0]=$0 } 
    $2==90 { if(match(line[-2], /^ *[0-9]+ +[1-6] /)) { 
        old=substr(line[-2], RLENGTH-2,2) 
        line[-2]=substr(line[-2], 1, RLENGTH-3) new[old] \ 
          substr(line[-2], RLENGTH) } } 
    NR>2 { printf("%s\n",line[-2]) } 
    END { printf("%s\n%s\n",line[-1],line[0]) }' file.in 
관련 문제