awk 匹配两个文件,并以相反的顺序读取第二个文件中的分隔符 '_'

awk 匹配两个文件,并以相反的顺序读取第二个文件中的分隔符 '_'

我必须找到 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

由于第二个文件中的目录路径名包含不同数量的下划线字符(例如01January_2020vs. 01_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它来分隔组合索引键的不同部分。

结果与此答案中的第一个解决方案相同。

相关内容