2つのファイルがあります。
ファイル1:
No ID CV CA1 CA2
1 transcr_10283 0.999023367236861 -0.344113101336184 -0.032235130455987
2 transcr_10371 -0.572755303094372 -0.579145581184253 0.879510598089221
3 transcr_10391 0.999589933675858 -0.379226454955611 -0.302057879326854
4 transcr_10428 0.128862262957329 0.579502720160717 -0.960283285879896
5 transcr_10673 -0.555906836336222 0.996418809959179 0.83927901939441
6 transcr_10719 -0.977601905205625 -0.297994976855801 -0.988480730161833
7 transcr_10805 -0.994387636575223 -0.924363947763111 -0.096820331033279
8 transcr_1084 0.929966893591254 0.994040100421911 0.604483398826667
9 transcr_10892 0.987734223438821 0.822187392097743 0.968727545498998
10 transcr_10892 0.999938729100654 -0.985209499864003 0.958993756142276
ファイル2:
No ID CV CA1 CA2
1 transcr_8921 0.972442945255909 0.937065785923838 0.999643394568925
2 transcr_10428 0.128862262957329 0.808685528374441 -0.987431892147214
3 transcr_25793 -0.576556453265197 0.956853490465593 -0.712579124289414
4 transcr_1966 0.66610055219078 0.199587132187484 0.47438019134052
5 transcr_10428 -0.770206245250698 -0.434541952574813 0.413082695627957
6 transcr_20649 0.828958672046763 -0.301011711451322 0.85215236415901
7 transcr_11317 0.09699438477018 -0.728279374568874 -0.555587423971877
8 transcr_11317 -0.556544875244594 0.52241898249443 0.361144169769576
9 transcr_7135 0.525796225375268 -0.915309254508446 0.352117890583668
10 transcr_6234 -0.254737326090742 -0.842640701643698 0.435449408114073
file1
(低い行数)と(file2
より高い行数)を使用する列を含む結果ファイルが必要です。したがって、次のようなものを探しています。$2
$3
No ID CV CA1 CA2
1 transcr_10283 0.999023367236861 -0.344113101336184 -0.032235130455987
2 transcr_10371 -0.572755303094372 -0.579145581184253 0.879510598089221
3 transcr_10391 0.999589933675858 -0.379226454955611 -0.302057879326854
5 transcr_10673 -0.555906836336222 0.996418809959179 0.83927901939441
6 transcr_10719 -0.977601905205625 -0.297994976855801 -0.988480730161833
7 transcr_10805 -0.994387636575223 -0.924363947763111 -0.096820331033279
8 transcr_1084 0.929966893591254 0.994040100421911 0.604483398826667
9 transcr_10892 0.987734223438821 0.822187392097743 0.968727545498998
10 transcr_10892 0.999938729100654 -0.985209499864003 0.958993756142276
File2がソートされていないが、ファイルをソートせずに行う方法を探しています。
ありがとうございます!
編集:見やすくするために、transcr_10428 0.128862262957329
この例ではfor行が削除されました。
答え1
そしてawk
:
$ awk -v FS="\t" -v OFS="\t" 'NR==FNR {trans[$2"|"$3]++; next;} FNR==1 {print} FNR>1 {if(!trans[$2"|"$3]) print}' file2 file1
- まず
file2
、2列と3列の値を読み、使用してリストのキーとして保存します。 - 読み込んだ場合は、
file1
ヘッダー行を印刷します。次の行では、前に作成したリストに2列と3列の値を持つキーが存在することを確認します。そうでない場合は、その行を印刷します。
答え2
ファイルの比較方法は明確に説明/定義されていません。
しかし、だからといって私があなたの心を読もうとするのを止めることはできません。
私が知る限り、ファイル2はある種のデータベースファイルまたは参照です。ファイル1には新しいデータが含まれていることがわかりました。
私が理解している「比較」:ファイル1の列2または3の値がすでにファイル2(つまり参照)にある場合は、それを印刷/含めないでください。それ以外の場合は印刷/含めてください。
良いニュースは、要求どおりに並べ替えが必要ないということです。
以下は、2つのパラメータを使用するスクリプトです。最初のパラメータは新しいデータファイル(例ではファイル1)です。 2番目はデータベースファイルです(例ではファイル2)。
#!/bin/bash
new_file=$1
db_file=$2
# Just checking the last parameter
if [ "x" = "x$db_file" ]; then
echo >&2 "[ERROR] This scripts expect 2 file path as parameter."
exit 1
fi
if [ ! -f $new_file ]; then
echo >&2 "[ERROR] First parameter file doesn't exist."
exit 2
fi
if [ ! -f $db_file ]; then
echo >&2 "[ERROR] First parameter file doesn't exist."
exit 3
fi
declare -A data_base
# Open both files and assign to file descriptor 10 and 11
exec 10< $new_file
exec 11< $db_file
# Step 1
# Building map of base data first (for the comparison to happen in next step)
first_line=1
while [ /bin/true ];
do
read -u 11 db_file_col1 db_file_col2 db_file_col3 db_file_rest || {
break;
}
# Skipping the header so that it will appear in the diff as shown in the example
if [ $first_line -ne 0 ]; then
first_line=0
continue
fi
# Creating map from Col 2 and Col 3 (keys) to the whole line (value)
data_base[$db_file_col2]="$db_file_col1 $db_file_col2 $db_file_col3 $db_file_rest"
data_base[$db_file_col3]="$db_file_col1 $db_file_col2 $db_file_col3 $db_file_rest"
done
# Step 2
# Actual comparison ...
while [ /bin/true ];
do
read -u 10 new_file_col1 new_file_col2 new_file_col3 new_file_rest || {
break;
}
if [ -z "${data_base[$new_file_col2]}" ] && [ -z "${data_base[$new_file_col3]}" ]; then
echo "$new_file_col1 $new_file_col2 $new_file_col3 $new_file_rest"
fi
done
たとえば、スクリプトを process.sh というファイルに保存し、「chmod 755 process.sh」を使用して実行可能にする場合は、次のようにします。
./process.sh file1 file2
正確な予想出力/結果につながります。
注:このスクリプトは、ファイル2の内容の2倍以上をメモリに保存します。十分なメモリがあることを確認してください。