2つの異なるcsvファイルから同じ名前の列を抽出する

2つの異なるcsvファイルから同じ名前の列を抽出する

2つの異なるcsvファイルがあります。 1つは拡張列名を含み、もう1つは同じ列名へのショートカットを含みます。

たとえば、

csvファイル1は次のとおりです。

gender,aciclovir drug,aclidinium bromide abc,acenocoumarol drdd
male,2008,2009,2009

csvファイル2は次のとおりです。

gender,aciclovir,aclidinium bromide,ajmaline
male,2008,2009,2010

それでは、ファイル2の列と共通の単語を持つファイル1の列を抽出しようとしています。

私の例に必要な出力を入れるには:

gender,aciclovir drug,aclidinium bromide abc
male,2008,2009

ベストアンサー1

2つのファイルのヘッダーが特別なCSV参照を持たないカンマ区切りのフィールド名の簡単なリストであると仮定すると、次のコマンドを使用してファイルの他の行からフィールド名を抽出できます。

head -n 1 file | tr , '\n'

またはsed

sed -e 'y/,/\n/' -e q file

また、すべてのフィールド名に正規表現の特殊文字(、、、、、(.フィールド名の先頭)および(フィールド名の終わり))が含まれていないと仮定すると[、それを使用してセットを作成できます。 Will内の正規表現はフィールド名の先頭に一致します(各行の先頭に挿入するとこれが行われます)。*\^$file2file1^

head -n 1 file2 | tr , '\n' | sed 's/^/^/'

またはsed

sed -e 'y/,/\n/' -e q file2 | sed 's/^/^/'

それともsed電話で

sed -e 'y/,/\n/' -e 's/^/^/' -e 's/\n/&^/g' -e q file2

またはGNUを使用してsed

sed -e 's/^/^/' -e 's/,/\n^/g' -e q file2

フィールド名リストにこれらの式を適用して、file1このファイルから抽出する必要があるフィールド名を取得できます。

grep -f <( head -n 1 file2 | tr , '\n' | sed 's/^/^/' ) <( head -n 1 file1 | tr , '\n' )

質問に表示されるデータを考慮すると、結果は次のリストになります。

gender
aciclovir drug
aclidinium bromide abc

file2のフィールド名がのフィールド名を2つ以上一致する場合は、このリストに重複した項目を含めることができますfile1

その後、これらのフィールド名のカンマ区切りリストを作成し、それをcutサブコマンドの引数として使用できます。ミラー最後に必要なフィールドを抽出しますfile1

mlr --csv cut -f "$( grep -f <( head -n 1 file2 | tr , '\n' | sed 's/^/^/' ) <( head -n 1 file1 | tr , '\n' ) | tr '\n' , )" file1

これは私たちに与えるでしょう

gender,aciclovir drug,aclidinium bromide abc
male,2008,2009

おすすめ記事