2016-09-16 1 views
0

price.txt 파일은 두 열 갖는다 : (이름 및 값)출력 다른 열의 각 루프의 결과

Mary 134 
Lucy 56 
Jack 88 

range.txt 파일은 세 개의 열 갖는다 : (과일 MIN_VALUE 및 MAX_VALUE)

apple 57 136 
banana 62 258 
orange 88 99 
blueberry 98 121 

을 내 목표는 price.txt 파일의 값이 range.txt의 min_value와 max_value 사이에 있는지 테스트하는 것입니다. 예인 경우 1을 출력하고 그렇지 않은 경우 "x"을 출력합니다. 다음처럼

awk 'FNR == NR { name=$1; price[name]=$2; next} { 
    for (name in price) { 
     if ($2<=price[name] && $3>=price[name]) {print 1} else {print "x"} 
    } 
}' price.txt range.txt 

을하지만 내 결과를 하나의 열에 모두 : 각각의 이름은 하나의 열이 (: 사실

1 
1 
x 
x 
x 
x 
x 
x 
1 
1 
1 
x 

, 나처럼 내 결과를 원하는

나는 시도) 내가 출력 파일을 추가 할 수 paste를 사용할 필요가 있기 때문에

1 x 1 
1 x 1 
x x 1 
x x x 

range.txt 파일을 함께. 최종 결과는 다음과 같아야합니다 :

apple 57 136 1 x 1 
banana 62 258 1 x 1 
orange 88 99 x x 1 
blueberry 98 121 x x x 

그래서 어떻게 각기 다른 열의 결과를 얻을 수 있습니까? 그리고 현재의 코드를 기반으로 paste없이 최종 결과를 출력 할 수 있습니까? 고맙습니다.

+0

print 문은 ORS (기본적으로 새 줄)를 인수에 추가합니다. 더 많은 출력 제어를 위해 printf (예 : printf ("1"))를 사용할 수 있습니다. –

답변

1

이것은 당신이 제공하는 무엇을 기반으로,

# load prices by index to maintain read order 
FNR == NR { 
    price[names++]=$2 
    next 
} 
# save max index to avoid using non-standard length(array) 
END { 
    names=NR 
} 
{ 
l = $1 " " $2 " " $3 
for (i=0; i < names; i++) { 
    if ($2 <= price[i] && $3 >= price[i]) { 
      l = l " 1" 
    } else { 
      l = l " x" 
    } 
} 
print l 
} 

및 출력을 생성, 그러나

apple 57 136 1 x 1 
banana 62 258 1 x 1 
orange 88 99 x x 1 
blueberry 98 121 x x x 

, 당신은 점수의 사람 이름 (익명 결과)가 없습니다 - 어쩌면 의도적이다 ?

변경 사항은 순서를 유지하기 위해 첫 번째 블록에 채워진 배열을 명시 적으로 색인화하는 것입니다.

+0

고맙습니다, @ 쿠런, 사실 저는 "이름"순서 (왼쪽에서 오른쪽으로 메리, 루시와 잭입니다)로 정렬 할 열이 필요합니다. 나는 갑자기 생각이났다 : "1"과 "x"를 각 행에있는 문자의 문자열로 출력 할 수있는 가능성이 있는가? 예 : 첫번째 줄은'apple 57 136 1x1','1x1'은 Mary, Lucy, Jack의 순서로 정렬됩니다. – lightsnail

+0

'length (array)'는 이제 POSIX의 일부이며, 더 이상 특정 gawk에만 해당하는 것이 아닙니다. 'l'이라는 이름의 변수를 결코 사용하지 마십시오. 숫자가 너무 많아서 '1'과 같지 않아서 코드를 난처하게 만듭니다. 모든 awk 내장/생성 배열, 함수 및 문자열은 0이 아닌 1에서 시작하므로 나중에 수동으로 만든 배열을 1에서 시작하여 나중에 배열이 어떻게 만들어 졌는지 기억하지 않아도됩니다. –