Unix 스크립트에서 awk를 사용하여 일부 열을 추가하는 방법

Unix 스크립트에서 awk를 사용하여 일부 열을 추가하는 방법

행을 추가하고 열을 선택해야 합니다. 나는 사용하고 싶다

문서

1 2 3
1 2
1

매개변수가 없으면 스크립트는 다음을 반환해야 합니다.

6 (1st row)
3 (2nd row)
1 (3rd row)

이 부분을 위해 제가 만든 코드는 다음과 같습니다.

awk '{ for(i=1; i<=NF;i++) sum+=$i; print(sum); sum=0 }' $FILE

매개변수 1과 2(열 수)를 사용하면 스크립트는 열 1과 2의 모든 행을 추가해야 하므로 다음을 반환해야 합니다.

3 (1st+2nd column)
3 (1st+2nd column)
1 (1st+2nd (blank) column))

내가 필요한 유일한 것은 특정 행만 합산하는 조건입니다.

답변1

변수를 전달할 수 awk있으며 명령은 다음과 같습니다.

awk -v col1=1 -v col2=2 '{ for(i=1; i<=NF;i++) {if (i == $col1 || i == $col2 ) sum+=$i}; print(sum); sum=0 }' $FILE
  • -v var=value 프로그램 변수 var에 값을 할당합니다.

원하는 만큼 열을 추가할 수 있습니다. 추가한 -v colx=value다음 조건에 추가하세요.|| i == $colx

열 번호를 쉘 스크립트에 전달하려면 이를 배열에 추가한 columnsArray다음 변수를 생성하면 columns=$(echo "${columnsArray[@]}")명령이 다음과 같아야 합니다.

awk -v outCols="$columns" 'BEGIN{split(outCols, cols, " ")} { for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' $FILE

예를 들어

#!/bin/bash
columns=$(echo "$@")
awk -vcolss="$columns" 'BEGIN{split(colss, cols, " ")}{ for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' test

다음을 반환합니다:

3
3
1

답변2

좋아, 내가 얻고 싶은 대답은 다음과 같다.

    #!/bin/bash
    PLIK=$1
    shift
    d=${@}
    awk -v c="$d" 'BEGIN {split(c,a," ")}{c=0; for(i in a) c+=$a[i]; print c}' $FILE

./script.sh file.txt 1 2돌아올 것이다 3 3 1그리고 ./file.sh file.txt 2 3돌아올 것이다, 5 2 0그게 맞다

관련 정보