ファイル1:
0000002|SLM DEV CORP |PO 857
0000003|S TOPPING |APT 19
0000004|JD BROS LTD |PO 118
0000005|ZKZ SERVICES |14699 CREDITVIEW RD
ファイル2:
0000001|GTI CONSULTING |4513 GLADEBROOK CRES
0000002|SLM DEVELOPMENT CORP | SLM |PO BOX 857
0000003|S TOPPING |APT 19
0000004|JD PLETT BROS LTD |PO BOX 118
0000005|ZKZ SERVICES |ZKZ |14699 CREDITVIEW RD
予想出力:
0000002|SLM DEVELOPMENT CORP | SLM |PO BOX 857
0000003|S TOPPING |APT 19
0000004|JD PLETT BROS LTD |PO BOX 118
0000005|ZKZ SERVICES |ZKZ |14699 CREDITVIEW RD
私はJoinコマンドを試しました。
join -j1 1 -j2 1 -t'|' -o 1.1 2.2 2.3 file1 file2
パイプ区切り記号が原因で誤った出力が発生します。また、列 2 にはすべての記号を使用できるため、他の記号を区切り記号として使用することはできません。
ファイル2の列1を一致させ、列2と3を垂直にコピーする必要があります。
また、file2からfile1の列1のデータを繰り返し出力を取得しようとしましたが、ファイルが非常に大きいため、時間がかかります。
答え1
awk
結合フィールドが一意の場合は、単に使用してください。
awk -F"|" 'a[$1]++' file1 file2
-F"|"
パイプを区切り記号として設定a[$1]++
条件です。条件が true の場合、対応する行が印刷されます。最初のフィールドが$1
複数回表示される場合、条件は true です。
結合フィールドが一意でない場合:
awk -F"|" 'a[$1]++&&FNR!=NR' file1 file2
FNR!=NR
:やはり真でなければならない条件です。これはfile2
処理された2番目のファイルにのみ適用されます。両方のファイルの最初のフィールドが一意であることを保証できる場合は、この条件を削除できます。
答え2
一方通行:
awk -F"|" 'NR==FNR{a[$1];next}($1 in a)' file1 file2
これは最初のファイルを読み取り、すべてのキーを配列に保存します。 2番目のファイルを処理するときは、配列にキーがある行のみを印刷します。
ファイルサイズが大きいため、ファイルをソートされた順序でソートする必要があるため、結合は推奨されません。
答え3
私が知る限り、file2
最初のフィールドのすべての行だけが必要ですfile1
。その場合は、grep
検索とawk
/を使用してcut
最初のフィールドを取得できます。
$ grep -f <(cut -d '|' -f 1 file1) file2
0000002|SLM DEVELOPMENT CORP | SLM |PO BOX 857
0000003|S TOPPING |APT 19
0000004|JD PLETT BROS LTD |PO BOX 118
0000005|ZKZ SERVICES |ZKZ |14699 CREDITVIEW RD
または:
$ grep -f <(awk -F'|' '{print $1}' file1) file2
0000002|SLM DEVELOPMENT CORP | SLM |PO BOX 857
0000003|S TOPPING |APT 19
0000004|JD PLETT BROS LTD |PO BOX 118
0000005|ZKZ SERVICES |ZKZ |14699 CREDITVIEW RD