次の問題が発生しました(質問をするために単純化しました)。次のスキーマファイルがありますpatternfile.txt
。
ALNTPKDHI
CTDDNALAY
CTDDNALAYY
およびルックアップファイルlookup.txt
:
ALNTPKDHI 1
CTDDNALAY 2
CTDDNALAYY 3
次のコマンドを実行します。
$ grep -w -f patternfile.txt lookupfile.txt
次を返します。
ALNTPKDHI 1
CTDDNALAY 2
3番目の項目は一致するものを返す必要がありますが、一致するものは返しません。最後の2つの項目の順序を変更すると、patternfile.txt
3つの項目がすべて返されます。
誰でもこれを説明できますか?
ありがとうございます!
答え1
再現できません。
$ printf '%s\n' ALNTPKDHI CTDDNALAY CTDDNALAYY > patterns.txt
$ printf '%s\n' 'ALNTPKDHI 1' 'CTDDNALAY 2' 'CTDDNALAYY 3' > input.txt
$ grep -w -f patterns.txt input.txt
ALNTPKDHI 1
CTDDNALAY 2
CTDDNALAYY 3
パターンや入力に、異常な制御文字やキャリッジリターンなどの空白文字が含まれていることを確認してください。
答え2
スキーマファイルの最後の行が不完全な場合、つまり最後の行が改行で終わらない場合にのみ表示される内容を再現できます。行が不完全な場合はgrep
使用されません。
ファイルを実行すると、od -c
最後の文字が何であるかを確認できます。以下は最後の行の例です。いいえ改行文字で終わります。
$ od -c pattern.txt
0000000 A L N T P K D H I \n C T D D N A
0000020 L A Y \n C T D D N A L A Y
0000035
以下は、ファイルが改行文字で終わる場合の例です。
$ od -c pattern.txt
0000000 A L N T P K D H I \n C T D D N A
0000020 L A Y \n C T D D N A L A Y \n
0000036
次のコマンドを使用してファイルに改行を追加できます。
echo >>pattern.txt
ほとんどのテキストエディタは、最初に改行がない場合、ファイルを保存すると、テキストの最後の行に終了行の改行を自動的に追加します。