2つのファイルを比較し、文字列と一致しない行の最初の単語のみを印刷します。

2つのファイルを比較し、文字列と一致しない行の最初の単語のみを印刷します。

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 ありがとうございます。

関連情報