AWK: 값이 일치하고 다른 파일의 값보다 작은 행을 추출하시겠습니까?

AWK: 값이 일치하고 다른 파일의 값보다 작은 행을 추출하시겠습니까?

내 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이전 행을 인쇄해야 합니다. file1file2

위 예에서 원하는 출력은 다음과 같습니다.

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

관련 정보