두 파일을 비교하고 문자열과 함께 일치하는 줄과 일치하지 않는 줄의 첫 번째 단어만 인쇄하고 싶습니다.
file1.txt
=========
abc 123
bcd 234
cde 345
file2.txt
=========
abc 123
bcd 223
cde 234
위의 abc는 file1.txt와 file2.txt 모두에서 일치합니다. 그래서 다음과 같이 인쇄해야 합니다.
abc is matching. it is ok.
위의 file1.txt와 file2.txt에서는 bcd와 cde 사이에 차이가 없습니다. 그래서 다음과 같이 인쇄해야 합니다.
bcd is not matching. please check.
cde is not matching. please check.
답변1
그리고 awk
:
awk 'NR==FNR{a[$1]=$2; next}; $2==a[$1] {print $1 " OK"; next} \
{print $1 " Not OK"}' f1.txt f2.txt
NR==FNR
첫 번째 파일에 대해서만 작동합니다f1.txt
. 여기서는a
첫 번째 필드를 키로, 두 번째 필드를 값으로 사용하여next
조건을 더 아래로 이동하지 않고 다음 레코드로 이동합니다.$2==a[$1]
두 번째 파일의 두 번째 필드가f2.txt
배열의 첫 번째 키 필드 값과 일치하는지 확인a
하고 원하는 형식으로 인쇄합니다.
예:
% cat f1.txt
abc 123
bcd 234
cde 345
% cat f2.txt
abc 123
bcd 223
cde 234
% awk 'NR==FNR{a[$1]=$2; next}; $2==a[$1] {print $1 " OK"; next} {print $1 " Not OK"}' f1.txt f2.txt
abc OK
bcd Not OK
cde Not OK
답변2
awk 'NR==FNR{A[NR]=$0;next}{if($0==A[FNR]){print $0 "is matching. it is ok"}else{print $0 "is not matching. please check"}}' file1.txt file2.txt
읽을 수 있는 형식
awk 'NR==FNR{
A[NR]=$0;
next
}
{
if($0==A[FNR])
{
print $0 "is matching. it is ok"
}
else{
print $0 "is not matching. please check"
}
}' file1.txt file2.txt
답변3
코드 @Kamaraj가 업데이트되었습니다. 다음 줄을 변경해야 합니까?
print $0 "is matching. it is ok"
print $0 "is not matching. please check"
통과
split($0,a,/ /); print a[1] " is matching. it is ok"
split($0,a,/ /);print a[1] " is not matching. please check"
또는 print $1 "일치합니다. 문제 없습니다" print $1 "일치하지 않습니다. 확인하십시오"
모든 스크립트는 다음과 같습니다.
awk 'NR==FNR{
A[NR]=$0;
next
}
{
if($0==A[FNR])
{
split($0,a,/ /); print a[1] " is matching. it is ok"
}
else{
split($0,a,/ /);print a[1] " is not matching. please check"
}
}' file1.txt file2.txt
시간:
@heemayl real0m0.159s user0m0.000s system0m0.046s
@Kamaraj real0m0.102s user0m0.000s system0m0.031s 대나뉘다
@Kamaraj real0m0.099s user0m0.000s system0m0.062s그리고1
@Kamaraj에게 감사드립니다.