파일 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
관련된:
- 질문에 대한 내 대답grep을 사용하여 두 파일에 없는 텍스트 찾기
답변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