最初の列に基づいて2つのファイルを比較します。一致する場合は行を保持[閉じる]

最初の列に基づいて2つのファイルを比較します。一致する場合は行を保持[閉じる]

こんにちは、

2つのcsvファイルがあります:File1(約18800行):

            p1  p10 p16 p19 p25 p3  p5  p6  p8  p9
    A3      567 0   3   0   18  17  8   4   6   7
    B23     490 7   6   2   23  26  20  14  12  29
    A56     737 1   4   1   6   4   1   4   8   5
    Z56     145 6   4   0   11  17  5   9   22  11
    D89     68  0   0   34  4   0   0   0   0   0
    A12     46  0   0   8   0   0   0   0   0   0
    A15     72  0   0   8   0   1   0   0   0   0
    D4      40  0   0   0   0   1   5   18  0   0
    Z6       7  0   1   0   1   1   10  1   2   0
    X3      49  0   0   125 0   0   0   0   0   0

ファイル2(約400行)

        name    tax price class order 

        B23      kat 35    2      1
        Z56      mat 26    3      2
        D4       kat 26    4      1

さて、これら2つのファイルを最初の列として比較したいと思います。 2番目のファイルの値が最初のファイルにある場合は、一致する行全体を維持したいと思います。以下はサンプル出力です。

            p1  p10 p16 p19 p25 p3  p5  p6  p8  p9
    B23     490 7   6   2   23  26  20  14  12  29
    Z56     145 6   4   0   11  17  5   9   22  11
    D4      40  0   0   0   0   1   5   18  0   0

エディター: File1cat

    "","p1","p10","p16","p19","p25","p3","p5","p6","p8","p9"
"p1_1_length_2509_cov_19.337112",567,0,3,0,18,17,8,4,6,7
"p1_10_length_1072_cov_559.052910",4900,7,6,2,23,26,20,14,12,29
"p1_11_length_1032_cov_5800.211050",73784,1,4,1,6,4,1,4,8,5
"p1_12_length_1022_cov_10156.344134",145873,6,4,0,11,17,5,9,22,11
"p1_13_length_946_cov_7.164835",77,17936,61876,5257,6085,196,8383,24956,4656,14687
"p1_14_length_921_cov_15.662469",68,0,0,34,4,0,0,0,0,0
"p1_16_length_800_cov_7.126300",46,0,0,8,0,0,0,0,0,0
"p1_17_length_758_cov_12.328051",72,0,0,8,0,1,0,0,0,0
"p1_19_length_722_cov_5.621849",40,0,0,0,0,1,5,18,0,0

ファイル2猫:

name,superkingdom,phylum,class,order,family,genus,species
p10_1003_length_529_cov_12.940299,Viruses,,,,Poxviridae,Alphaentomopoxvirus,Anomala cuprea entomopoxvirus
p10_1021_length_525_cov_6.801508,Viruses,,,Herpesvirales,Alloherpesviridae,Batrachovirus,Ranid herpesvirus 1
p10_1047_length_521_cov_4.852792,Viruses,,,,,,Hudisavirus sp.
p10_1152_length_501_cov_22.430481,Viruses,,,,Mimiviridae,Cafeteriavirus,Cafeteria roenbergensis virus
p10_139_length_1152_cov_892.463415,Viruses,,,,,,Hudisavirus sp.
p10_149_length_1130_cov_7.540379,Viruses,,,Picornavirales,Picornaviridae,Enterovirus,Enterovirus C

答え1

最初のファイルの最初の列が2番目のファイルの列に対応するすべての行を抽出しようとしています。

最初のファイルの最初の列にはテキストのみが含まれているようです(残りは数字です)、単にgrepそれを使用できます。

bashプロセス置換を理解する他のシェルでは、これは問題になる可能性があります。

grep -F -f <( awk -F, 'NR > 1 { print $1 }' <file2 ) file1 >newfile

他のシェルでは、まずコマンド出力を一時awkファイルに書き込み、それをgrep -f.

awk次のような出力を生成します。

p10_1003_length_529_cov_12.940299
p10_1021_length_525_cov_6.801508
p10_1047_length_521_cov_4.852792
p10_1152_length_501_cov_22.430481
p10_139_length_1152_cov_892.463415
p10_149_length_1130_cov_7.540379

grep最初のファイルのすべての行に一致させるために、これを固定文字列パターンとして使用します。

awkまず、2番目のファイルの最初の列を連想配列のキーとして読み、次にそのキーに対して最初のファイルの最初の列をテストすることを含むすべての操作を実行できます。

awk -F, 'NR==FNR && FNR>1 { keys[sprintf("\"%s\"", $1)] }
         NR!=FNR && FNR>1 && ($1 in keys)' file2 file1

変ですsprintf()。最初の列がfile1二重引用符で囲まれているためです。で読み取ったデータに二重引用符を追加するだけですfile2

から始めたらFNR>1NR==FNRfile2

答え2

これは、単に1つのストリームで作業するのではなく、スクリプト言語ではなく、プログラミング言語に最適な作業です。基本的なアルゴリズムは次のとおりです。

  1. 最初のファイルを1行ずつ読みます。すべての最初の要素のリストを構成します。 (使用する言語によっては、ハッシュや辞書が最も効率的になる場合があります。)
  2. 2番目のファイルを1行ずつ読みます。最初の要素がリストの#1にある場合は、それを出力ファイルに保存します。

関連情報