file1
와 비교 하고 싶습니다 file2
.
file1
경로 이름 세트와 file2
단어 세트를 포함합니다.
경로 이름에 두 번째 파일의 단어가 포함되어 있으면 줄 앞에 추가해야 합니다 //
.
file1
:
xxx/AAA.tmp.v
xxx/BBB.tmp.v
xxx/CCC.tmp.v
file2
:
BBB
CCC
FFF
새 파일에서 원하는 출력:
xxx/AAA.tmp.v
// xxx/BBB.tmp.v
// xxx/CCC.tmp.v
답변1
당신이 사용할 수있는 awk
.
awk -F"[/.]" 'NR==FNR{seen[$0];next}
($2 in seen){print "// "$0; next}1
' file2 file1
-F"[/.]"
필드 구분 기호를 슬래시/
또는 점 으로 정의합니다.
.NR==FNR
이는 첫 번째 입력 데이터(여기서는 file2)에 대해 항상 적용됩니다.오른쪽에코코드질소수량==에프엘리오른쪽에코코드질소숫자.seen[$0];next
위의 내용이 true인 경우 file2의 전체 줄을 배열이라는 이름으로 저장seen
하고 다음 줄을 읽습니다.next
(실제로는 첫 번째 줄로 이동하여 까지 이 블록을 다시 실행합니다NR!=FNR
.)($2 in seen){print "// "$0; next}1
이는 두 번째 입력 파일(여기서는 file1)에서만 작동하며seen
배열에$2
file1의 열#2와 동일한 문자열이 포함되어 있는지 확인한 다음 미리 추가된 file1의 전체 줄을 인쇄//
하고next
일치할 때까지 조건을 다시 확인합니다. 그렇지 않으면 다음을 인쇄합니다. 조건이 포함된 전체 라인1
(이것은 활성화awk
의 기본 동작입니다).
답변2
다음을 수행할 수 있습니다 sed
.
sed '/tmp/!{H;d;}
G;s/$/\
/;s_.*\(..*\).*\n\1\n_// &_
P;d' file2 file1
예약된 공간에서 file2에 대한 패턴을 수집하고 file1의 각 라인에 대한 컬렉션을 추가하고 역참조를 사용하여 해당 라인에서 패턴이 발견되는지 확인합니다.
자세한 설명은 참조하세요이 질문과 답변.
이 문자열을 사용하여 tmp
file1에 있음을 나타냅니다. 상황에 맞게 이를 조정해야 할 수도 있습니다. 2번째 줄에서 시작하는 이상한 대체는 끝에 개행 문자를 추가하므로 각 패턴이 개행 문자로 둘러싸여 있다는 것을 알 수 있습니다.