こんにちは、
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>1
。NR==FNR
file2
答え2
これは、単に1つのストリームで作業するのではなく、スクリプト言語ではなく、プログラミング言語に最適な作業です。基本的なアルゴリズムは次のとおりです。
- 最初のファイルを1行ずつ読みます。すべての最初の要素のリストを構成します。 (使用する言語によっては、ハッシュや辞書が最も効率的になる場合があります。)
- 2番目のファイルを1行ずつ読みます。最初の要素がリストの#1にある場合は、それを出力ファイルに保存します。