2つのcsvファイルがあります(サイズが大きく、行が不足しています)。ここでは、同じ行数のサンプルファイルのみを提供します。
ファイル1:
NC_008689 2 NA NA NA NA
NC_002670 3 NA NA NA 186
NC_002671 9 NA NA NA 107
NC_009382 25 9 15 NA 100
NC_003977 45 92 535 NA 492685
ファイル2:
NC_008689 Siphoviridae,Biseptimavirus,Staphylococcus virus 108PVL
NC_002670 Siphoviridae,,Lactococcus phage bIL311
NC_002671 Siphoviridae,,Lactococcus phage bIL312
NC_009382 Myoviridae,Peduovirus,Ralstonia virus RSA1
NC_003977 Hepadnaviridae,Orthohepadnavirus,Hepatitis B virus
希望の出力:
Siphoviridae,Biseptimavirus,Staphylococcus virus 108PVL 2 NA NA NA NA
Siphoviridae,,Lactococcus phage bIL311 3 NA NA NA 186
Siphoviridae,,Lactococcus phage bIL312 9 NA NA NA 107
Myoviridae,Peduovirus,Ralstonia virus RSA1 25 9 15 NA 100
Hepadnaviridae,Orthohepadnavirus,Hepatitis B virus2 45 92 535 NA 492685
私は試した:
awk 'FNR==NR { F2[$1]=$2 ; next } $1 in F2 {$1 = F2[$1] ; print } ' File2 File1
しかし、その結果、私は次のような結果を得ました。
Siphoviridae,Biseptimavirus,Staphylococcus 2 NA NA NA NA
Siphoviridae,,Lactococcus 3 NA NA NA 186
Siphoviridae,,Lactococcus 9 NA NA NA 107
Myoviridae,Peduovirus,Ralstonia 25 9 15 NA 100
Hepadnaviridae,Orthohepadnavirus,Hepatitis 45 92 535 NA 492685
スペースを含むFile2の名前に問題があります。
答え1
join
最初のフィールドを使用できますcut
。
join <(sort File2) <(sort File1) | cut -d' ' -f2-
または、印刷したいすべてのフィールドをjoin
追加してください。-o
join -o 1.2,1.3,1.4,2.2,2.3,2.4,2.5,2.6 <(sort File2) <(sort File1)
答え2
努力する
awk 'FNR == NR { u=$1 ; $1="" ; F[u]=$0 ; }
$1 in F { $(NF +1) = F[$1] ; $1 = "" ; print }'
どこ
$1 = ""
その値が(やや)削除されます$1
。$(NF +1) = F[$1]
file1 の行を file2 の末尾に追加します。
答え3
次のコマンドを使用してテストすると、うまく動作します。
for i in `cat file2|awk '{print $1}'`; do j=`sed -n '/'$i'/p' file2| awk '{print $2,$3,$4}'`; sed -i "s/$i/$j/g" file1; done
出力
Siphoviridae,Biseptimavirus,Staphylococcus virus 108PVL 2 NA NA NA NA
Siphoviridae,,Lactococcus phage bIL311 3 NA NA NA 186
Siphoviridae,,Lactococcus phage bIL312 9 NA NA NA 107
Myoviridae,Peduovirus,Ralstonia virus RSA1 25 9 15 NA 100
Hepadnaviridae,Orthohepadnavirus,Hepatitis B virus 45 92 535 NA 492685