![awk는 두 파일을 일치시키고 두 번째 파일의 구분 기호 '_'를 역순으로 읽습니다.](https://linux55.com/image/213252/awk%EB%8A%94%20%EB%91%90%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%9D%BC%EC%B9%98%EC%8B%9C%ED%82%A4%EA%B3%A0%20%EB%91%90%20%EB%B2%88%EC%A7%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EA%B5%AC%EB%B6%84%20%EA%B8%B0%ED%98%B8%20'_'%EB%A5%BC%20%EC%97%AD%EC%88%9C%EC%9C%BC%EB%A1%9C%20%EC%9D%BD%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
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_2020
대 01_January_2020
)가 포함되어 있으므로 이를 해당 파일의 구분 기호로 사용할 수 없습니다 _
. 적어도 비교하는 데이터가 동일하다고 가정하는 경우에는 사용할 수 없습니다. 모든 라인의 필드가 우수합니다. 너도 가지고 있어파일 이름밑줄 개수(예: re_01Jan2020_11_58_40_B2_W1_x_90.00_Oz_10.00.mmts
및 ESC_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
복합 인덱스 키의 여러 부분을 구분해야 합니다.
결과는 이 답변의 첫 번째 솔루션과 동일합니다.