한 파일의 열에 다른 파일의 같은 행에 있는 숫자를 곱하는 방법은 무엇입니까?

한 파일의 열에 다른 파일의 같은 행에 있는 숫자를 곱하는 방법은 무엇입니까?

두 개의 파일이 있는데 둘 다 동일한 줄 수를 가지고 있습니다. 파일 1에는 16개의 열이 있고 파일 2에는 2개의 열이 있습니다.

파일 1

1 2 3 4...
2 3 4 5...
3 4 5 6...

파일 2

text 10
text 11
text 12

이제 다음 출력이 포함된 다른 파일을 원합니다.

10 20 30 40...
22 33 44 55...
36 48 60 72...

awk를 사용해 보았지만 성공하지 못했습니다.

답변1

$ awk '{ getline line <"file2"; split(line,a); for (i=1; i<=NF; ++i) $i *= a[2] };1' file1
10 20 30 40
22 33 44 55
36 48 60 72

file1명령줄에 주어진 각 줄에 대해 프로그램은 awk그 줄에서 한 줄을 읽고 file2공백으로 나누어 배열로 만듭니다 a. 의 두 번째 요소는 a현재 레코드( 에서 file1)의 각 필드를 곱하는 데 사용됩니다. 루프가 끝나면 후행 1결과 수정 레코드가 출력됩니다.

텍스트에 file2공백이 포함되어 있으면 항상마침내사용해야 하는 파일의 필드를 확인한 다음 line문자열이 몇 개의 필드로 분할되는지 추적합니다.

$ awk '{ getline line <"file2"; nf=split(line,a); for (i=1; i<=NF; ++i) $i *= a[nf] };1' file1
10 20 30 40
22 33 44 55
36 48 60 72

두 번째 파일의 이름을 하드코딩하지 않으려면 해당 이름을 awk명령줄의 변수에 전달하세요.

$ awk -v other=file2 '{ getline line <other; nf=split(line,a); for (i=1; i<=NF; ++i) $i *= a[nf] };1' file1
10 20 30 40
22 33 44 55
36 48 60 72

...또는 해당 이름을 환경 변수에 전달합니다.

$ other=file2 awk '{ getline line <ENVIRON["other"]; nf=split(line,a); for (i=1; i<=NF; ++i) $i *= a[nf] };1' file1
10 20 30 40
22 33 44 55
36 48 60 72

관련 정보