2つのファイルを比較し、文字列で一致する行と一致しない行の最初の単語だけを印刷したいと思います。
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
、最初のフィールドをキーに、2番目のフィールドを値として使用して、next
条件を下に移動せずに次のレコードに移動します。$2==a[$1]
2番目のファイルの2番目のフィールドが配列の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 ありがとうございます。