私のLinuxコンピュータには次のfile1
ファイルがあります。
ID Time Energy
43 4.38665978376386365240533e-05 3.215e-02
43 4.38666558838421885677290e-05 4.788e-01
48 4.77674337753321466689890e-05 1.750e-01
48 4.77674676992522297732519e-05 3.360e-01
52 4.99184267458611271553633e-05 3.110e-01
52 4.99184755438830858337990e-05 2.000e-01
203 2.17111141925415134391192e-04 0.000e+00
203 2.17111189970080955017814e-04 1.685e-01
203 2.17111190317825032474949e-04 3.425e-01
206 2.17705422992319207490738e-04 3.197e-01
206 2.17705445825075834731174e-04 1.913e-01
245 2.54300470583329032894099e-04 2.130e-01
245 2.54300477743886715713273e-04 2.679e-02
245 2.54300499465897461830871e-04 4.887e-02
245 2.54300511632548666141052e-04 0.000e+00
245 2.54300542217183317417195e-04 0.000e+00
245 2.54300549393671508017351e-04 2.224e-01
そしてfile2
:
ID Time Energy
43 4.38666558838421885677290e-05 4.788e-01
48 4.77674676992522297732519e-05 3.360e-01
52 4.99184267458611271553633e-05 3.110e-01
203 2.17111190317825032474949e-04 3.425e-01
206 2.17705422992319207490738e-04 3.197e-01
245 2.54300549393671508017351e-04 2.224e-01
読みたいのですが、行のエネルギー値が存在する場合は、file1
前の行を印刷する必要があります。 file1
file2
上記の例では、目的の出力は次のようになります。
43 4.38665978376386365240533e-05 3.215e-02
48 4.77674337753321466689890e-05 1.750e-01
52 4.99184267458611271553633e-05 3.110e-01
203 2.17111189970080955017814e-04 1.685e-01
206 2.17705422992319207490738e-04 3.197e-01
245 2.54300542217183317417195e-04 0.000e+00
問題は、同じID番号でfile1の特定の行のエネルギー値がfile2に存在する場合、この行の前の行を印刷することです。 awkでこれを行う方法を知っている人はいますか?私はコードを試しました:
gawk '
NR==FNR {a[NR]=$0; next }
{
split(a[FNR],flds,FS,seps)
if(flds[1]=$1 && flds[2] <=$2)
print flds}' file1 file2 > flie3
それからsort | uniq を使用して同じ ID を持つ重複行を削除します。
すべてのファイルの時間値を増やし、ファイル2と同じエネルギー値を持つ行が同じID番号内の最初の行になると、その行のみが選択されます。良い52 4.991842674586112715536 33e-05 3.110e-01
答え1
awk '
NR==FNR{ if (FNR>1)a[$1]=$3; next } # file2: save ID,Energy value in array `a`
$1 in a{ # file1: if ID is present in array
if (a[$1] != $3){ # if it is not the same Energy value...
prev=$0 # save previous line
}
else { # it is the same Energy value...
print (prev=="") ? $0 : prev # print previous line if saved or current line
prev="" # reset previous line
}
}
' file2 file1 > file3
出力:
43 4.38665978376386365240533e-05 3.215e-02
48 4.77674337753321466689890e-05 1.750e-01
52 4.99184267458611271553633e-05 3.110e-01
203 2.17111189970080955017814e-04 1.685e-01
206 2.17705422992319207490738e-04 3.197e-01
245 2.54300542217183317417195e-04 0.000e+00