まず、各ファイルの列3、5、7を一致させ、file1の行をfile2の対応する行の横に配置し、file1をfile2と並べ替えたいと思います。
これは2つの間のネストを維持する必要があるコードですが、file2をfile1に追加したいと思います。助けてくれてありがとう!
awk 'NR==FNR {a[$3$5$7];next}($3$5$7 in a){print $0}'
ファイル1
#Scaffold Position Ref. Nuclueotide Pid allele count Pid allele Non-pid allele count Non-pid allele Overlapping gene/region
NW_006532398.1 202035 C 35:0:0:0:0:0 A 0:0:29:0:0:0 C KCND2
NW_006532656.1 289646 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532656.1 289656 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532656.1 289666 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532656.1 289676 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532657.1 636 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532657.1 646 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532657.1 656 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
NW_006532658.1 345 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
ファイル2
#Scaffold Position Ref. Nuclueotide Pid allele count Pid allele Non-pid allele count Non-pid allele
HiC_scaffold_7 49526089 C 0:0:28:0:0:0 A 0:31:0:0:0:0 C
HiC_scaffold_7 49539537 C 27:0:0:0:0:0 T 0:0:0:29:0:0 C
HiC_scaffold_7 49972546 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972556 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972566 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972576 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972586 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972596 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C
HiC_scaffold_7 49972599 A 20:0:0:0:0:0 A 0:0:0:27:0:0 C
HiC_scaffold_7 49972646 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C
ファイル3
#Scaffold Position Ref. Nuclueotide Pid allele count Pid allele Non-pid allele count Non-pid allele Scaffold Position Ref. Nuclueotide Pid allele count Pid allele Non-pid allele count Non-pid allele
HiC_scaffold_7 49526089 C 0:0:28:0:0:0 A 0:31:0:0:0:0 C NW_006532398.1 202035 C 35:0:0:0:0:0 A 0:0:29:0:0:0 C KCND2
HiC_scaffold_7 49539537 C 27:0:0:0:0:0 T 0:0:0:29:0:0 C NW_006532656.1 289646 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972546 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532656.1 289656 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972556 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532656.1 289666 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972566 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532656.1 289676 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972576 A 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532657.1 636 A 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972586 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532657.1 646 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972596 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532657.1 656 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
HiC_scaffold_7 49972599 A 20:0:0:0:0:0 A 0:0:0:27:0:0 C
HiC_scaffold_7 49972646 C 20:0:0:0:0:0 T 0:0:0:27:0:0 C NW_006532658.1 345 C 0:26:0:0:0:0 T 0:0:26:0:0:0 C CNTN1
答え1
まず、file2
前のタブを編集して削除します。それ以外の場合、フィールド 3、5、7 は一致しません。
awk -F"\t" '
NR==FNR{
a[FNR]=$3","$5","$7 # save fields 3,5,7
b[FNR]=(FNR==1 ? substr($0, 2) : $0) # save the line (remove first char on 1st line)
last=FNR # save the last line nr
next # continue with next line
}
{
printf $0 # print current line
for (i=1;i<=last;i++){
if(a[i]==$3","$5","$7){ # fields 3,5,7 match?
printf FS b[i] # append matching line
a[i]="" # clear value
break # break loop
}
}
print ""
}
' file1 file2
3,5,7フィールドを配列に保存a
し、現在の行を$0
配列に保存します(b
タイトルの場合は$0
最初の文字を除く)。処理するときは、配列内で最初に一致する要素を見つけ、そのインデックスを使用して配列行を追加してから、配列要素を消去します。#
file2
a
b
a
答え2
私は過去に次のようにegrepをsortと組み合わせて同様のことをしました。
egrep '[A-z0-9]' file1 file2 | xargs -L1 | sed -e's/:/ /g' | sort -k4,4 -k6,6 -k8,8 -k1,1
(1,1
ソートする最後のキーはファイル名を含む最初の列です。)もちろん、元のファイルの列3のように列を数字でソートする必要がある場合、または-k4,4g
-を実行してk4,4gr
順序を逆にすることもできます。ソート順。他の列をどのようにソートするのかわかりません。 "sort"でインターリーブを開始すると、awkのパイプラインを引き続き使用し、最初の列(ファイル名)の内容に基づく印刷条件を使用できます。私のコンピュータでは、このタイプの操作が簡単になるため、常にファイル名にスペースを入れないでください。 「egrep」はすべての行を取得するために使用され、行の先頭にファイル名を印刷する方法です。これにより、Sortのファイル名を使用して、左側に必要な列を取得できるようにインターリーブできます。次の点はまだテストしていませんが(バグであったり、苦手な場合もあります)、開始することができます。
egrep '[A-z0-9]' $file1 $file2 | xargs -L1 | sed -e's/:/ /g' | sort -k4,4 -k6,6 -k8,8 -k1,1 | awk -vf1="${file1}" -vf2="${file2}" 'BEGIN {last="XXX"} { if ($1==f1) { if (last != "XXX") printf("\n"); } else { if (last==f2) printf("\n blank blank blank "); } ; printf("%s %s %s",$4,$6,$8); last=$1 } END {printf("\n");} ' > output.txt
sed の意味は、egrep が入れた「:」を削除し、ファイル名を別の最初の列に残すことです。 file2ファイル名が最初にアルファベット順に出てくる場合は、-1,1r
Sortで、を使用する必要があります。 file1 が output.txt ファイルの左側にあることを意味します。
また、両方のファイルのすべての列には、保存された情報にスペースがないと仮定します。 「ソート」を実行すると、列ヘッダーの位置がめちゃくちゃになるため、別々に処理する必要があります。