4

2 つの比較的大きなタブ区切りファイル file1.txt、file2.txt があるとします。

file1.txt
id\tcity\tcar\ttype\tmodel

file2.txt 
id\tname\trating

file1.txt には 2000 の一意の ID があるため、2000 の一意の行があり、file2.txt には 1000 の一意の行しかないため、1000 の一意の ID があるとします。2 つのテーブルをマージする方法はありますか?

ケース 1. file1.txt の ID でそれらをマージします。file2.txt に ID がない場合、NA が入力されます。

ケース2。file2.txt の ID でそれらをマージします。ここで、file2.txt の ID のみが file1.txt と file2.txt のフィールドと共に出力されます。

注: マージされた新しいファイルもタブ区切りのファイルで、ヘッダー ファイルも含まれている必要があります。注2. また、ヘッダーがない場合の方法についても提案をいただければ幸いです。

ありがとう!

4

3 に答える 3

10
join -j 1 <(sort file1.txt) <(sort file2.txt)

標準のUNIXツールのみを使用して「ケース2」アプローチを行いますか。もちろん、ファイルがソートされている場合は、ソートを解除できます。

ヘッダーを含めた場合、結合されたヘッダーを先頭に並べ替えるために、ID が数値であることに依存する場合があります。

join -j 1 <(sort file1.txt) <(sort file2.txt) | sort -n

  • file1.txt

    id  city    car type    model
    1   york    subaru  impreza king
    2   kampala toyota  corolla sissy
    3   luzern  chrysler    gravity falcon
    
  • file2.txt

    id  name    rating
    3   zanzini PG
    2   tara    X
    
  • 出力:

    id  city    car type    model   name    rating
    2   kampala toyota  corolla sissy   tara    X
    3   luzern  chrysler    gravity falcon  zanzini PG
    

PS TAB 区切り文字を保持するには、次の-tオプションを渡します。

 join -t'    ' ...

' ' に TAB 文字が含まれていることを SO で表示するのはちょっと難しいです。^VTAB(bashなどで)入力してください

于 2012-11-09T01:12:20.643 に答える
1

これはケース1でうまくいきました:

join -t $'\t' -1 1 -2 1 -a 1 -a 2 <(sort fileone.txt) <(sort filetwo.txt) | sort -n -t $'\t' > filethree.txt

それから:

awk '{if(NF+0<7) printf "%s\tNA\tNA\n", $0; else print $0}' filethree.txt

于 2012-11-09T15:52:07.830 に答える
0

これをやってみてください:

perl -lane '
    END{print "$_$h{$_}" for sort keys %h}
    $h{$F[0]} .= "\t" .  join "\t", @F[1..$#F];
' file1.txt file2.txt

このスクリプトは、ID (最初の列) で結合します。

于 2012-11-09T00:40:44.830 に答える