2016-10-04 2 views
0

아래에 설명 된 bash 스크립트에서 전달 된 변수를 사용하여 awk (루프 내부)와 테이블의 두 숫자를 합산하려고합니다. 내가 다루고있는 숫자 ($ value)는 부동 소수점 값입니다. $ 값에는 하나의 숫자 만 포함됩니다. 오류가 발생한 줄은 126, 125가 잘 작동합니다.awk 오류 인수 목록이 너무 길고 두 변수 만

111 while read line 
112 do 
120    n=2 
121    sum=0 
122 
123    for x in $(seq 1 $number) 
124    do 
125      value=$(echo "$line" | awk -v n="$n" '{print $n}') # I am just getting the values to sum up here 
126      sum=$(awk -v sum="$sum" -v value="$value" '{sum = sum + value; print sum}') 
         n=$((n+1)) 
129    done 
    done < $file 

여기서 $ number는 이전에 정의되어 있습니다.

./script.sh: line 126: /bin/awk: Argument list too long 

나는 단지이 라인에 awk 명령에 두 변수를 전달하기 위해 노력하고, 나는이 오류가있는 이유 어떤 생각 :

나는 다음과 같은 오류가?

"파일"의 테이블의 예 :

A  -0.717616  -0.623398  -0.214494  -0.352871 
    B  -0.19373  -0.140626  -0.0523623  0.0248858 
    C  -0.0822092  -0.302354  0.347158  -0.0373262 
    D  0.310213  0.312805  0.114366  0.353496 
    E  -0.175354  -0.0263985  -0.125694  -0.155082 

감사합니다!

+2

당신이하고 싶은 것을 이해하는 데 힘든 시간을 보냈지 만 한 줄씩 파일을 읽고, 그 줄의 필드를 하나씩 옮긴 다음 awk에서 결과를 추가하는 것은 정말 기괴한 방법처럼 보입니다. 해결하려고하는 것이 무엇이든 해결하십시오. 나는이 모든 일이 하나의 awk 명령으로 수행 될 수 있다고 여기에서 베팅하고있다. 파일의 예를 공유하고 예상되는 결과를 공유 할 수 있습니까? – JNevill

+1

'print'는'sum'의 값뿐만 아니라 전체 입력 행을 출력합니다. – chepner

+0

것은 라인 당 필드 수가 다른 여러 파일에서이 스크립트를 사용하고 있습니다. 기본적으로 라인 당 필드 수는 $ number에 포함됩니다. 파일이 어떻게 보이는지 샘플을 추가했습니다.이 파일에는 4 개의 열이 있지만 방금 언급했듯이이 숫자는 다를 수 있습니다. 예상되는 결과는 각 행에 대한 모든 필드의 합계입니다. 그 말이 더 의미가 있기를 바랍니다. 내가 지정할 수있는 다른 것이 있으면 알려줘. – arielle

답변

1

awk에 전화 두 가지 문제가 있습니다 : 당신이 입력 파일을 지정하지 않은, 그래서 그것을합니다 (while 루프도 읽을하려고하는 파일입니다) 상속 된 표준 입력에서 읽고, 그리고 sum (입력하는 동안 수정 됨) 값뿐만 아니라 읽는 각 행을 출력합니다.

이 여기 그런데, 파일에 번호를 추가하는 매우 비효율적 인 방법이지만,이 수정 된 버전입니다 :

while read line 
do 
    n=2 
    sum=0 

    for x in $(seq 1 $number) 
    do 
     value=$(echo "$line" | awk -v n="$n" '{print $n}') 
     sum=$(awk -v sum="$sum" -v value="$value" 'BEGIN {sum = sum + value; print sum}' </dev/null) 
     n=$((n+1)) 
    done 
done < $file 

더 나은 솔루션 : 난

awk 'BEGIN {sum=0} 
    {for (i=2;i<=NF;i++) { sum = sum + $i }} 
    END {print sum}' < $file 
+0

그것은 작동합니다, 감사합니다 !! 나는 이것이 이상한 방법으로 보인다는 것을 안다. 나는 왜 내 포스트에 대한 코멘트에서 이것을 좋아하는지 설명하려고 노력했다. 어쨌든 당신이 쓴 것은 훌륭합니다. – arielle

관련 문제