두 개의 텍스트 파일이 있는데 행과 열을 기준으로 해당 값을 비교하고 싶습니다. 비교하자면, 값이 같은지 확인하고 값이 같은지 에코하는 것을 의미합니다. 파일은 다음과 같습니다.
file1.txt
Name Col1 Col2 Col3
-----------------------
row1 1 4 7
row2 2 5 8
row3 3 6 9
file2.txt
Name Col1 Col2 Col3
-----------------------
row2 1 4 11
row1 2 5 12
제한사항은 다음과 같습니다.
- 존재하는 행만 비교합니다. 즉, row3은 file1.txt에 있지만 file2.txt에는 없으므로 비교가 필요하지 않습니다.
- 사용해야 한다AWK
- 파일의 줄이 순서가 아닐 수 있습니다.
- 내 AWK 버전이 지원하지 않기 때문에 이중 배열이 없습니다.
나는 다음과 같은 것을 생각하고 있습니다 :
awk 'NR>2 {next}
{
for (i=2;i<NR;i++) #For each row of file1.txt
{
for(j=1;i<NF;j++) #For each column of file1.txt
{
// Check if row and column of file1.txt is equal to row and column of file2.txt.
}
}
}
' file1.txt file2.txt
두 개의 서로 다른 텍스트 파일의 값을 비교하는 방법은 무엇입니까? 더 많은 설명이 필요하면 알려주시기 바랍니다.
내가 요구하는 것은 AWK의 공통 구성을 사용하는 것뿐입니다. 나머지는 알아낼 수 있기를 바랍니다.
답변1
그러면 두 파일 모두에 이름이 존재하지만 값이 다른 file2의 행이 출력됩니다.
awk 'NR==FNR {f1[$1]=$0; next} $1 in f1 && $0 != f1[$1]' file1.txt file2.txt
row2 1 4 11
row1 2 5 12
공백의 차이조차도 잘못된 결과를 낳을 수 있다는 것을 깨달았습니다. 다음 줄을 "정규화"할 수 있습니다.
awk '
NR==FNR {$1=$1; f1[$1]=$0; next}
$1 in f1 {$1=$1; if ($0 != f1[$1]) print}
' file1.txt file2.txt
row2 1 4 11
row1 2 5 12
답변2
gawk 4.x
이를 수행하는 방법에는 여러 가지가 있습니다 . 해결책은 다음과 같습니다 .
$ awk '
FNR < 2 { next }
FNR == NR {
for (i = 2; i <= NF; i++) {
a[$1][i] = $i;
}
next;
}
($1 in a) {
for (i = 2; i <= NF; i++) {
if (a[$1][i] == $i) {
printf("%s->Col%d: Equal\n", $1, i-1);
} else {
printf("%s->Col%d: Not Equal\n", $1, i-1);
}
}
}
' file1.txt file2.txt
row2->Col1: Not Equal
row2->Col2: Not Equal
row2->Col3: Not Equal
row1->Col1: Not Equal
row1->Col2: Not Equal
row1->Col3: Not Equal
설명하다
FNR < 2 { next }
: 처음 두 줄을 건너뜁니다.FNR == NR
: 첫 번째 파일을 처리하는 경우에만 true입니다. 각 열 값을 연관 배열a
형식으로 저장합니다a[ROW][COLUMN]
.($1 in a)
: file2의 행이 file1에 존재하는지 확인합니다. true인 경우 모든 열 값을 반복하여 file1의 값과 비교합니다.
이전 gawk
버전의 경우 다음을 시도해 볼 수 있습니다.
$ awk '
FNR < 2 { next }
FNR == NR {
for (i = 2; i <= NF; i++) {
a[i,$1] = $i;
b[$1];
}
next;
}
($1 in b) {
for (i = 2; i <= NF; i++) {
if (a[i,$1] == $i) {
printf("%s->Col%d: Equal\n", $1, i-1);
} else {
printf("%s->Col%d: Not Equal\n", $1, i-1);
}
}
}
' file1.txt file2.txt
답변3
for 루프 내에서 다음을 시도해 보세요.
awk ' {
if(i == j)
print "Same value";
else
print "Not the same";
}'
다음은 도움이 될 수 있는 간단한 조건문이지만 두 개의 서로 다른 텍스트 파일을 비교하여 추가 조정이 필요할 수 있습니다.