두 열의 변수 값을 기반으로 하는 여러 데이터프레임의 하위 집합 행

두 열의 변수 값을 기반으로 하는 여러 데이터프레임의 하위 집합 행

아래와 같이 여러 데이터 프레임이 있습니다.

df1

col1;col2;col3;col4
cat;1;2;blue
house;1;2;red
dog;5;6;yellow
mouse;7;8;white

df2

col1;col2;col3;col4
cat;3;4;grey
house;7;8;red
dog;5;6;yellow
mouse;3;4;black

df3

col1;col2;col3;col4
cat;5;6;grey
house;3;4;red
dog;5;6;yellow
mouse;9;10;grey

col2 및 col3의 값이 "cat"의 col2 및 col3 값과 동일한 모든 행의 부분 집합을 만들고 싶습니다. col2 및 col3의 값은 각 데이터 프레임에서 계속 변경되므로 일정하지 않습니다. 출력은 다음과 같습니다:

df1

col1;col2;col3;col4
cat;1;2;blue
house;1;2;red

df2

col1;col2;col3;col4
cat;3;4;grey
mouse;3;4;black

df3

col1;col2;col3;col4
cat;5;6;grey
dog;5;6;yellow

어떤 제안이 있으십니까? 사실 저는 항상 awk를 사용할 수 있습니다.

awk -F";" '{if($2=="1" && $3=="2")print $0}' df1 
awk -F";" '{if($2=="3" && $3=="4")print $0}' df2
awk -F";" '{if($2=="5" && $3=="6")print $0}' df3

하지만 수천 개의 데이터프레임이 있어서 코드 줄마다 값을 수동으로 입력하는 것이 번거롭습니다.

답변1

어때요?

awk -F\; '                              # set field separator
FNR == 1        {D1 = D2 = ""           # on new file (= line No. 1), reset variables
                 FN = FILENAME "_tmp"   # compose new filename
                 print > FN             # print header line to new file
                }
/^cat/          {D2 = $2                # if found "cat", set variables D2 and 
                 D3 = $3                # D3
                }
$2 == D2 &&                             # if fields $2 and $3 match variables, i.e. $2 and $3 from "cat" line
$3 == D3        {print > FN             # print line to new file
                }
' df*                                   # work on every "df*" file in sight

그런 다음 mv*tmp 파일이 원본 파일을 덮어씁니다...

관련 정보