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_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복합 인덱스 키의 여러 부분을 구분해야 합니다.

결과는 이 답변의 첫 번째 솔루션과 동일합니다.

관련 정보