以下のように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
CRLF
DOS型の改行()があり、join
ファイルを理解できません。
- オプション1
dos2unix
:リポジトリのファイルを使用して変換します。
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スタイルのソリューションであると仮定しますawk
。file
「非常に長い行」が含まれている場合、実際には意味がありません。
答え3
あなたのファイルfile1.txt
(少なくとも両方)はDOSテキストファイルです。 Unixシステムでテキストファイルとして使用される場合、DOSテキストファイルには各行の末尾に追加のキャリッジリターン文字があります。
各行末の追加のキャリッジリターンは、最初のファイルのデータの解釈を妨げるため、最初のファイルの末尾にキャリッジリターンがあるjoin
データとキャリッジリターンを含まないデータを一致させようとします。最後にキャリッジリターンがあります(2番目のファイルの最初のフィールド)。これは、一致する結合キーのペアがなく、どの出力も取得できないことを意味します。
ファイルをUnixテキストファイルに変換するなどのツールを使用して、dos2unix
コマンドを再試行してくださいjoin
。
システム管理タスクを実行しない場合は、rootユーザーアカウントの代わりに権限のないユーザーアカウントを使用することも考慮する必要があります。日常的な作業を実行するためにrootアカウントを使用することは、Unixシステムで通常行われているほとんどのセキュリティ対策(デフォルトのファイルやディレクトリ権限など)を無効にするため、無責任です。