두 파일(하나는 열을 포함함)에서 데이터를 읽고 해당하는 경우 데이터를 표시합니다.

두 파일(하나는 열을 포함함)에서 데이터를 읽고 해당하는 경우 데이터를 표시합니다.

두 파일의 데이터를 비교하려고 합니다. 그 중 하나에는 열이 포함되어 있으며 두 파일에 있는 데이터를 인쇄하려고 합니다.

파일 1:

item1
item2
item3

파일 2:

itemA item1
itemB item2
itemC item3

그래서 파일 1의 열 2를 파일 2와 비교하고 동일하다면 전체 행을 표시하고 싶습니다.

예를 들어파일 1포함하다:

data1
data2

그리고파일 2포함하다:

dataA data1
dataC data3

다음만 표시됩니다.

dataA data1

이는 file1의 데이터 항목을 포함하는 file2의 행이기 때문입니다.

미리 감사드립니다

답변1

사용 grep:

grep -Fwf file1 file2

~에서man grep:

-F, --fixed-strings
    Interpret PATTERN as a list  of  fixed  strings  (instead  of  regular  expressions),  separated  by
    newlines, any of which is to be matched.

-f FILE, --file=FILE
    Obtain patterns from FILE, one per line.  If this option is used multiple times or is combined  with
    the -e (--regexp) option, search for all patterns given.  The empty file contains zero patterns, and
    therefore matches nothing.

-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.

또는 awk:

awk 'NR==FNR{seen[$0]++} ($2 in seen)' file1 file2

위에서 먼저 우리가 읽고 있는 것은파일 1전체 열 1을 이름이 지정된 배열에 저장합니다., file2의 두 번째 열을 보고 file1에 저장된 열1과 일치하면 file2의 전체 줄을 인쇄합니다.

join두 파일이 모두 정렬된 경우 다음 명령을 사용할 수도 있습니다(그렇지 않은 경우 sorting을 통해 정렬된 출력을 전달할 수 있음).

join -1 1 -2 2 file1 file2

~에서man join

-1 FIELD
      join on this FIELD of file 1

-2 FIELD
      join on this FIELD of file 2

파일이 정렬되지 않은 경우:

join -1 1 -2 2 <(sort file1) <(sort file2)

관련 정보