awk は 2 つのファイルを一致させ、2 番目のファイルの区切り文字 '_' を逆順に読み込みます。

awk は 2 つのファイルを一致させ、2 番目のファイルの区切り文字 '_' を逆順に読み込みます。

file1とfile2で共通の行を見つける必要があります。このコードでは、区切り文字が最初から計算されます。_file2で区切り記号 ''のある行を逆順に(最後に初めて)読みたいです。

awk -F'_' '
    FNR==NR {a[$1,$2,$3,$4]; next}
    ($11,$12,$13,$14) in a {print $0}
' file1 file2

ファイル1

01Aug2020_10_48_25
06Jun2020_01_11_02
21Jun2020_09_30_07
05Jul2020_21_53_41
27Aug2020_21_15_15
17Aug2020_18_56_49
10Jun2020_07_00_25
10Jun2020_15_24_20
26Jun2020_09_25_34
30Jul2020_07_17_04
27Jul2020_03_36_35
24Jul2020_18_05_34

ファイル2

/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/re_01Jan2020_11_58_40_B2_W1_x_90.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/08_August_2020/01_Aug/ESC_re_01Aug2020_10_48_25_B3_W1_x_270.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01January_2020/01_Jan/ESC_re_01Jan2020_11_58_40_B4_W1_x_180.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01January_2020/01_Jan/ESC_re_01Jan2020_11_58_40_B5_W1_x_0.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/ESC_re_01Jan2020_12_07_36_B1_W1_x_0.00_Oz_0.00.mmts
/media/AGH/AGH_K_K/academi/P2020/06June_2020/21_Jun/ESC_re_21Jun2020_09_30_07_B2_W1_x_90.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/ESC_re_01Jan2020_12_07_36_B3_W1_x_270.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/ESC_re_01Jan2020_12_07_36_B4_W1_x_180.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01January_2020/01_Jan/ESC_re_01Jan2020_12_07_36_B5_W1_x_0.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/ESC_re_01Jan2020_12_19_13_B1_W1_x_0.00_Oz_0.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/ESC_re_01Jan2020_12_19_13_B2_W1_x_90.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01January_2020/01_Jan/ESC_re_01Jan2020_12_19_13_B3_W1_x_270.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01January_2020/01_Jan/ESC_re_01Jan2020_12_19_13_B4_W1_x_180.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/ESC_re_01Jan2020_12_19_13_B5_W1_x_0.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/ESC_re_01Jan2020_12_30_50_B1_W1_x_0.00_Oz_0.00.mmts
/media/AGH/AGH_K_K/academi/P2020/01_January_2020/01_Jan/ESC_re_01Jan2020_12_30_50_B2_W1_x_90.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/07July_2020/27_Jul/ESC_re_27Jul2020_03_36_35_B3_W1_x_270.00_Oz_10.00.mmts

答え1

暗闇の中で撮影:使用を妨げる理由

grep -ffile1 file2
/media/AGH/AGH_K_K/academi/P2020/08_August_2020/01_Aug/ESC_re_01Aug2020_10_48_25_B3_W1_x_270.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/06June_2020/21_Jun/ESC_re_21Jun2020_09_30_07_B2_W1_x_90.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/07July_2020/27_Jul/ESC_re_27Jul2020_03_36_35_B3_W1_x_270.00_Oz_10.00.mmts

、のデータ構造がfile1例に示すように一意であり、file2の目的のターゲット部分文字列とのみ一致すると仮定しますか?

答え2

2番目のファイルのディレクトリパス名には、異なる数のアンダースコア文字(大文字など01January_202001_January_2020が含まれているため、そのファイルの区切り文字として使用することはできません_。少なくとも比較するデータが同一で​​あると仮定する場合は使用できません。すべての行のフィールドが優れています。君も持ってるファイル名アンダースコアの数(と、などre_01Jan2020_11_58_40_B2_W1_x_90.00_Oz_10.00.mmtsESC_re_01Aug2020_10_48_25_B3_W1_x_270.00_Oz_10.00.mmtsが異なると、これがより明確になります。

数量は_変わらないと仮定後ろに日付文字列、必要に応じて各行の末尾から始まるフィールドを処理できます(おそらく「逆順」と言うときの意味でしょう)。この回答の最後にこれを表示します。私の最初のアプローチは、データを切り取り、日付文字列を行の残りの部分から分離することでした。

まず、文字列の先頭から最後の部分までディレクトリパス名を切り捨てます/。これは、親ディレクトリ名から誤って日付が一致するのを防ぐためです。日付文字列は、_数字で始まり、数字ではないで終わる最初の部分文字列であると仮定します。

awk 'NR == FNR { a[$0]; next }
    {
        datestamp = $0
        sub(".*/[^0-9]*", "", datestamp)
        sub("_[^0-9].*", "", datestamp)
    }

    (datestamp in a)' file1 file2

質問のデータを考慮すると、出力は次のようになります。

/media/AGH/AGH_K_K/academi/P2020/08_August_2020/01_Aug/ESC_re_01Aug2020_10_48_25_B3_W1_x_270.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/06June_2020/21_Jun/ESC_re_21Jun2020_09_30_07_B2_W1_x_90.00_Oz_10.00.mmts
/media/AGH/AGH_K_K/academi/P2020/07July_2020/27_Jul/ESC_re_27Jul2020_03_36_35_B3_W1_x_270.00_Oz_10.00.mmts

現在のレコードのフィールド数を保持する内部変数を使用して、各行のNF最後にフィールドのアドレスを指定できます。

awk -F _ 'NR == FNR { a[$1,$2,$3,$4]; next }
    ($(NF-9) SUBSEP $(NF-8) SUBSEP $(NF-7) SUBSEP $(NF-6) in a)' file1 file2

上記の使用法を参照してくださいSUBSEP。これは、awk連想配列から複合インデックスキーを生成するときに使用される特別な区切り文字です。インデックスに存在することを確認したい文字列を生成しているので、aこれを明示的に使用してSUBSEP複合インデックスキーのさまざまな部分を区別する必要があります。

結果はこの回答の最初の解決策と同じです。

関連情報