file1과 file2의 코드를 grep하여 file3에 작성해야 합니다.

file1과 file2의 코드를 grep하여 file3에 작성해야 합니다.

특수 문자와 이름 사이에 공백이 포함된 제품 이름이 포함된 파일이 있습니다. 마지막에는 제품 코드가 있습니다.

file2에는 제품 이름만 있고 코드는 없습니다.

파일 내부를 살펴보고 제품 이름을 검색하고 해당 제품 이름에서 코드를 가져와 file3에 쓰는 명령이 필요합니다.

내가하고 싶은 일의 예시 이미지는 다음과 같습니다.여기

예

올바른 명령을 내리도록 도와주실 수 있나요?

답변1

grep매뉴얼 에서 :

-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX .

따라서 다음 명령은 file1의 file2에서 일치하는 행을 찾습니다.

grep -f file2 file1

그런 다음 첫 번째 명령의 출력에서 ​​마지막 필드를 가져옵니다.

grep -f file2 file1 | awk '{ print $NF }' > file3

지침

@them이 댓글에서 언급했듯이 주의해야 할 몇 가지 주의 사항이 있습니다.

  1. 댓글에서:

file2as 패턴을 사용하면 grep그 안의 텍스트가 정규식으로 처리됩니다. 이는 특정 문자(예: .*)가 예기치 않게 일치할 수 있음을 의미합니다.

예를 들어 file2행이 포함된 경우에도 일치 This is a dot.할 수 있습니다 .This is a dotxfile1

이 문제를 해결하려면 add 플래그를 사용하여 -F/--fixed-strings패턴의 모든 문자를 리터럴로 처리할 수 있습니다.

-F, --fixed-strings
       Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F  is specified by POSIX.)
  1. @they가 쓴 대로:

또한 정규식은 기본적으로 고정되지 않습니다. 즉, 로 시작하는 줄 MM706도 로 시작하는 줄과 일치합니다 QMM706.

일부 해결 방법은 다음 플래그를 사용하는 것입니다 -w/--word-regexp.

-w, --word-regexp
       Select  only  those  lines  containing  matches  that form whole  
       words.  The test is that the matching substring must  either  be
       at  the  beginning  of  the  line,  or  preceded  by  a non-word
       constituent character.  Similarly, it must be either at the  end
       of  the  line  or  followed by a non-word constituent character.
       Word-constituent  characters  are  letters,  digits,   and   the
       underscore.

그러나 여전히 줄의 시작 부분에 나타나는 패턴만 일치하는지 보장하지 않기 QMM706때문에 문제를 부분적으로만 해결합니다 .MM706

둘 다 사용할 수도 -F있고 -w결합하여 -f원하는 결과를 얻을 수도 있습니다.

답변2

각 행에서 공백으로 구분된 마지막 필드를 가져오려는 것 같습니다.

awk '{ print $NF }' file.txt

기본적으로 awk각 입력 줄은 공백과 탭의 필드로 분할됩니다(이러한 공백 문자 중 하나 이상이 두 필드를 서로 구분합니다). 결과 필드 수는 특수 변수에 저장됩니다 NF. 마지막 필드는 를 사용하여 액세스할 수 있습니다 $NF.


file2.txt제품의 하위 집합만 있고 해당 하위 집합에서만 제품 코드를 가져오고 싶고 file.txt마지막 필드의 숫자가 해당 제품에 고유하다고 가정하면 다음 file2.txt을 사용할 수 있습니다.

awk 'NR == FNR { nr[$NF] = 1; next } ($(NF-1) in nr) { print $NF }' file2.txt file.txt

그러면 끝에 있는 숫자가 file2.txt배열의 키로 읽혀집니다. 그런 다음 nr각 행의 마지막에서 두 번째 필드에 있는 숫자를 저장된 숫자와 file.txt비교 nr하고 해당 숫자가 배열의 키로 존재하는 경우 마지막 필드를 인쇄합니다.

나는 앉아서 이미지의 데이터를 기록하지 않을 것이기 때문에 이것은 분명히 테스트되지 않았습니다.

답변3

또한 시도

grep -f file2 file1 | grep -o '[^ ]*$'

관련 정보