다른 파일의 값을 기준으로 파일 필터링

다른 파일의 값을 기준으로 파일 필터링

파일이 두 개 있어요

파일 1:

U   20      100     1_A         1_A
U   14      200     1_B         1_B
U   14      300     1_C         1_C

파일 2:

D   12  90      1_A     1_A
D   15  97      1_A     1_A
D   16  99.5    1_A     1_A
D   9   111     1_A     1_A
D   71  200     1_B     1_B
D   88  198     1_B     1_B
D   12  210     1_B     1_B
D   11  211     1_B     1_B
D   9   266     1_C     1_C
D   18  278     1_C     1_C
D   20  300.5   1_C     1_C
D   17  300     1_C     1_C

4열에는 두 파일의 동일한 값이 포함되어 있지만(5열도 4열과 동일) file1에서는 각 값이 한 번만 나타나는 반면, file2에서는 각 값이 여러 번 나타나지만 2열은 3열과 다릅니다. .

세 번째 열의 값이 file2의 해당 행(네 번째 열의 값이 동일함)의 ±1 내에 있는 file2에서 행을 가져오고 싶습니다.

예상 출력:

D   16   99.5       1_A
D   71   200        1_B     
D   20   300.5      1_C     
D    17  300        1_C

이것을 사용해 보세요:

while read c1 c2 c3 c4 
do
awk '{if ( a = $4  &&  b < $3+1 && b > $3-1 ) print $1 "    " $2 "  " $3 "  " $5 }' a="$c4" b="$c3"  file2.txt > output.txt
done < file1.tx

나는 다음과 같은 결과를 얻었습니다.

D   20  300.5   1_C
D   17  300     1_C

따라서 마지막 행의 b 값만 사용합니다.

답변1

만 사용쉘 루프가 필요하지 않습니다.

awk 'NR==FNR{ col4[$4]=$3; next }
  (-1< col4[$4]-$3 && col4[$4]-$3 <1) { print $1, $2, $3, $5 }' file1 file2

세 번째 열 값에 ±1을 더하고 해당 쌍과 비교하는 대신 두 숫자를 뺀 결과가 정확히 (-1,1) 범위 내에 있는지 확인해야 합니다.

차이를 [-1,1] 범위에 두려면 다음을 수행하십시오.

awk 'NR==FNR{ col4[$4]=$3; next }
  (-1<= col4[$4]-$3 && col4[$4]-$3 <=1) { print $1, $2, $3, $5 }' file1 file2

관련 정보