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内の正規表現はフィールド名の先頭に一致します(各行の先頭に挿入するとこれが行われます)。*
\
^
$
file2
file1
^
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