두 파일을 비교하고 일치하는 경우 입력을 수정합니다.

두 파일을 비교하고 일치하는 경우 입력을 수정합니다.

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배열에 $2file1의 열#2와 동일한 문자열이 포함되어 있는지 확인한 다음 미리 추가된 file1의 전체 줄을 인쇄 //하고 next일치할 때까지 조건을 다시 확인합니다. 그렇지 않으면 다음을 인쇄합니다. 조건이 포함된 전체 라인 1(이것은 활성화 awk의 기본 동작입니다).

답변2

다음을 수행할 수 있습니다 sed.

sed '/tmp/!{H;d;}
G;s/$/\
/;s_.*\(..*\).*\n\1\n_// &_
P;d' file2 file1

예약된 공간에서 file2에 대한 패턴을 수집하고 file1의 각 라인에 대한 컬렉션을 추가하고 역참조를 사용하여 해당 라인에서 패턴이 발견되는지 확인합니다.

자세한 설명은 참조하세요이 질문과 답변.

이 문자열을 사용하여 tmpfile1에 있음을 나타냅니다. 상황에 맞게 이를 조정해야 할 수도 있습니다. 2번째 줄에서 시작하는 이상한 대체는 끝에 개행 문자를 추가하므로 각 패턴이 개행 문자로 둘러싸여 있다는 것을 알 수 있습니다.

관련 정보