솔루션 1

솔루션 1

다음과 같이 많은 행과 5개의 숫자 열이 포함된 파일이 있습니다.

1  2  3  4  5   
6  7  8  9  10   
11 12 13 14 15   
16 17 18 19 20   
21 22 23 24 25   
...

첫 번째와 세 번째 행에 있는 숫자의 합을 이 방법으로 얻으려면: 1+11, 2+12, 3+13, 4+14, 5+15 이는 내가 궁극적으로 보고 싶은 것은 무엇을 12 14 16 18 20 해야 하는지를 의미합니다. 저것?

답변1

솔루션 1

#!/bin/bash
{ read -ra line1; read _; read -ra line3; }
for i in "${!line1[@]}"; do
  result+=("$(( ${line1[i]} + ${line3[i]} ))")
done
printf %s\\n "${result[*]}"

예:

$ bash script < yourfilename
12 14 16 18 20
$ 

스크립트 설명

{ read -ra line1; read _; read -ra line3; } 이 부분은 파일의 처음 세 줄을 읽고 처음 두 줄만 유지합니다. 또한 배열 line1과 line3으로 분할합니다. 표준 입력에서 데이터 스트리밍을 가정합니다. 이를 수행하는 방법에 대한 예를 참조하십시오.

for i in "${!line1[@]}"; do result+=("$(( ${line1[i]} + ${line3[i]} ))"); done 이 부분은 두 배열 중 하나의 요소를 반복하고 line1과 line2의 동일한 요소를 합산합니다. 결과는 result라는 새로운 배열에 저장됩니다.

printf %s\\n "${result[*]}" 계산된 배열 요소를 공백으로 구분하여 인쇄합니다.


솔루션 2

입력에 필요에 따라 5개의 열이 있다고 가정하여 루프를 방지하는 또 다른 솔루션은 다음과 같습니다.

#!/bin/bash
{ read a b c d e; read _; read v w x y z; }
echo "$((a+v)) $((b+w)) $((c+x)) $((d+y)) $((e+z))"

예:

$ cat yourfilename
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
...
$ bash script < yourfilename
12 14 16 18 20
$ 

스크립트 설명

{ read a b c d e; read _; read v w x y z; } 1번 줄(또는 3번 줄)의 숫자를 변수 a~e(또는 v~z)로 읽어옵니다.

echo "$((a+v)) $((b+w)) $((c+x)) $((d+y)) $((e+z))" 요청 시 공백으로 구분된 변수의 합계를 인쇄합니다.

답변2

$ sed -n '1p;3p' file | datamash -W sum 1-5
12      14      16      18      20

먼저 sed라인 1과 3만 출력됩니다. 그런 다음 GNU에 입력되어 datamash열 1부터 5까지의 각 개별 열을 합산하라는 지시를 받습니다. 이는 연속된 공백이 필드 구분 기호로 처리됨을 -W나타냅니다 .datamash

출력은 탭으로 구분됩니다. 공백으로 구분된 출력을 얻으려면 --output-delimiter=' '다음 옵션을 사용하십시오 datamash.

$ sed -n '1p;3p' file | datamash -W --output-delimiter=' ' sum 1-5
12 14 16 18 20

답변3

awk 'NR==1 || NR==3 { for (i=1; i<=NF; i++) a[i]+=$(i)}END{for (i in a) printf "%s ", a[i]; print ""}'

예:

$ awk 'NR==1 || NR==3 { for (i=1; i<=NF; i++) a[i]+=$(i)}END{for (i in a) printf "%s ", a[i]; print ""}'' yourfilename
12 14 16 18 20
$ 

편집: 세 번째 줄 이후에 파일에서 줄 읽기를 중지하려면 일찍 종료하면 됩니다. 그러나 10,000줄 미만을 포함하는 파일의 경우 큰 차이가 없습니다.

awk 'NR==1 {split($0,a)} NR==3 {for (i in a) printf "%s ", a[i]+$i; print ""; exit}'

귀하의 예에서 작동하는지 입증하십시오.

$ cat yourfilename
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
...
$ awk 'NR==1 {split($0,a)} NR==3 {for (i in a) printf "%s ", a[i]+$i; print ""; exit}' yourfilename
12 14 16 18 20
$ 

관련 정보