두 개의 파일이 있는데 첫 번째 파일의 열 1이 다른 파일의 열 1 값과 일치하면 값을 추가하고 새 파일에 씁니다.

두 개의 파일이 있는데 첫 번째 파일의 열 1이 다른 파일의 열 1 값과 일치하면 값을 추가하고 새 파일에 씁니다.

파일 1

Name    marks
sagat    20
raji     30
kamal    56
sanj     10

파일 2

Name    marks
sagat    20
kamal    56
Jagan    30
suraj    90
sanj     78

출력 파일 1(공통 이름)

Name    marks
sagat    40
kamal    112
sanj     88

출력 파일 2

Name    marks
raji     30
Jagan    30
suraj    90

답변1

쉘이 프로세스 대체(예 bash: )를 지원한다고 가정합니다.

$ join <( sort file1 ) <( sort file2 ) | awk 'BEGIN { OFS="\t"; print "Name", "Marks" } !/^Name/ { print $1, $2 + $3 }'
Name    Marks
kamal   112
sagat   40
sanj    88

join명령은 첫 번째 열(이름)에 있는 두 개의(정렬된) 파일을 연결하고 나타나는 내용을 출력합니다.둘 다파일과 각 파일의 태그를 두 번째 및 세 번째 열로 표시합니다. 이 3열 데이터는 awk헤더를 출력한 다음 두 번째와 세 번째 열의 이름과 합계를 인쇄하는 짧은 프로그램에 공급됩니다( Name이전 헤더인 로 시작하는 행은 처리하지 않음).

$ join -v1 -v2 <( sort file1 ) <( sort file2 ) | awk 'BEGIN { OFS="\t"; print "Name", "Marks" } !/^Name/ { print $1, $2 + $3 }'
Name    Marks
Jagan   30
raji    30
suraj   90

이는 유사한 작업을 수행하지만 이제 join파일 태그를 두 번째 열로 사용하여 두 파일의 고유 이름을 출력합니다. 단순화를 위해 awk절차는 동일하지만 세 번째 열이 없기 때문에 여기서는 $2 + $3단축할 수 있습니다 .$2

관련된:

답변2

아마도 다음과 같을 것입니다:

#!/bin/sh

I1=./InputFile1
I2=./InputFile2
O1=./OutputFile1
O2=./OutputFile2

rm $O1 $O2
awk 'NR>1{print $1" "$2}' $I1 | while read id mark
    do
        if grep "^$id[ \t]" $I2 >/dev/null; then
            add=`awk "/^$id[ \t]/{print \\$2}" $I2`
            echo $id $(expr $mark + $add) >>$O1
        fi
    done
(
    awk 'NR>1{print $1" "$2}' $I1
    awk 'NR>1{print $1" "$2}' $I2
) | sort -u | while read id mark
    do
        if ! grep "^id[ \t]" $O1 >/dev/null; then
            echo $id $mark >>$O2
        fi
    done

답변3

대리자awk

awk -v f="mark.txt" '{
    if (FNR==1) {nof+=1; printf ( "%s\t%s\n", $1, $2) > nof"."f}
        else {marks[$1]+=$2; howManyResults[$1]+=1}
    } END {for (name in marks) printf ("%s\t%s\n", name, marks[name]) >>howManyResults[name]"."f
}' file1 file2

산출

1. 마크.txt

Name    marks
Jagan   30
suraj   90
raji    30

2. 마크.txt

Name    marks
sanj    88
kamal   112
sagat   40

답변4

다음은 위의 출력 파일을 생성하는 awk 스크립트입니다.

#!/usr/bin/gawk -f    
BEGIN        { OFS="\t";          }

NR==1        { print > "out1"; print > "out2" }
FNR==1       { next }
$1 in stud   { print $1,$2+stud[$1] > "out1"; delete stud[$1]; next }
NF == 2      { stud[$1]=$2;  next }

END          { for(i in stud) print i, stud[i] > "out2" }

그런 다음:

$ chmod 755 procfs
$ procfs f1 f2

관련 정보