以下のように複数のデータフレームがあります。
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ファイルは元のファイルを上書きします。