Join コマンドは、大容量ファイルの比較時に出力を提供しません。

Join コマンドは、大容量ファイルの比較時に出力を提供しません。

ここに画像の説明を入力してください。以下のように2つのファイルがあります。 1つのファイルは20 GB、もう1つはMBです。

file1.txt (100 MB)

6000000
6000001
6000003
file2.txt (20 gb) 

6000000;dgdfgdfgdfgdfgdggeewtwtwtwetewtt
6000003;eryeyyrtuytityiytititityityiytii
6000005;qwrwqrwqrrrrerewrwerewrwrrrewrew

次のように一致するすべてのコンテンツと出力が必要です。

6000000;dgdfgdfgdfgdfgdggeewtwtwtwetewtt
6000003;eryeyyrtuytityiytititityityiytii

今、両方のファイルにソートコマンドを使用し、以下のコマンドをリンクしましたが、出力は出ませんか?ここで何が間違っているのかを助けてください。

join -t';' file1.txt file2.txt >> file3.txt

答え1

他の人がすでに述べたように、最初のファイルはあらかじめUNIX行末に変換する必要があります。ただし、ファイル自体を変更する必要はありません。代わりに、すぐに変換を試すことができます。

コマンドラインを次のように変更します。

join -t';' <(dos2unix file1.txt) file2.txt >> file3.txt

両方のファイルがdoで終わる場合は、次のようにします。

join -t';' <(dos2unix file1.txt) <(dos2unix file2.txt) >> file3.txt

答え2

CRLFDOS型の改行()があり、joinファイルを理解できません。

  • オプション1dos2unix:リポジトリのファイルを使用して変換します。
dos2unix file1.txt file2.txt

これによりファイルが変更されます。次に、どのプログラムがファイルを読み取るかに応じて、結果を再変換する必要がありますunix2dos file3.txt。何を推測すべきですか?

  • オプション2:レコード区切り記号awkとして使用:\r\n
awk ' BEGIN {FS=";" ; RS="\r\n" }
      NR==FNR { marker[$1]=$1 }
      NR!=FNR && $1 in marker ' file1.txt file2.txt

ここでの利点は、改行文字がそのまま維持され、20GBファイルが読み取りのみで処理されないことです。これは一時ファイルの書き込みに適しています。

ノートどちらのファイルもDOSスタイルのソリューションであると仮定しますawkfile「非常に長い行」が含まれている場合、実際には意味がありません。

答え3

あなたのファイルfile1.txt(少なくとも両方)はDOSテキストファイルです。 Unixシステムでテキストファイルとして使用される場合、DOSテキストファイルには各行の末尾に追加のキャリッジリターン文字があります。

各行末の追加のキャリッジリターンは、最初のファイルのデータの解釈を妨げるため、最初のファイルの末尾にキャリッジリターンがあるjoinデータとキャリッジリターンを含まないデータを一致させようとします。最後にキャリッジリターンがあります(2番目のファイルの最初のフィールド)。これは、一致する結合キーのペアがなく、どの出力も取得できないことを意味します。

ファイルをUnixテキストファイルに変換するなどのツールを使用して、dos2unixコマンドを再試行してくださいjoin

システム管理タスクを実行しない場合は、rootユーザーアカウントの代わりに権限のないユーザーアカウントを使用することも考慮する必要があります。日常的な作業を実行するためにrootアカウントを使用することは、Unixシステムで通常行われているほとんどのセキュリティ対策(デフォルトのファイルやディレクトリ権限など)を無効にするため、無責任です。

関連情報