두 파일 사이의 공통 줄

두 파일 사이의 공통 줄

터미널에서 다음 코드를 실행하고 있습니다.

LC_ALL=C && grep -F -f  genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed

이것은 두 파일 사이에 공통점을 제공하지 않습니다. 내가 거기에서 무엇을 놓치고 있습니까?

답변1

comm -12 file1 file2두 파일의 공통 줄을 가져오는 데 사용됩니다 .

예상대로 작동 하려면 파일을 정렬해야 할 수도 있습니다 comm.

comm -12 <(sort file1) <(sort file2)

~에서man comm:

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)

또는 사용grep-x명령을 실행 하려면 전체 줄을 일치 패턴으로 일치시키는 옵션을 추가해야 합니다 . 이 F옵션은 grep일치 패턴이 정규 표현식이 아닌 문자열로 일치되도록 지시합니다.

grep -Fxf file1 file2

또는 awk.

awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2

이것은 전체 줄을 읽는 것입니다파일 1seen키가 전체 행인 배열로 변환합니다 (in은 전체 현재 행을 awk의미함 ).$0

NR==FNR첫 번째 입력에 대해서만 다음 블록을 실행하는 조건 으로 사용합니다.파일 1설마파일 2( NR전체 레코드 수를 참조하면모두입력은 FNR각 개별 입력에 대한 파일 레코드 수입니다. 따라서 FNR이는 각 입력 파일에 대해 고유하고 NR모든 입력 파일에 대해 고유합니다. )

next문은 awk코드의 나머지 부분을 계속하지 말고 NR같지 않을 때까지 다시 시작하라는 의미입니다 FNR. 이는 모든 줄을 의미합니다.파일 1읽을 수 있습니다 awk.

그러면 다음 조건은 seen[$0]두 번째 입력에만 적용됩니다.파일 2. 각 행에 대해파일 2현재로 표시된 각 =1줄을 인쇄합니다.파일 1배열에서.

또 다른 간단한 옵션은 다음을 사용하는 것 sort입니다 uniq.

sort file1 file2|uniq -d

이렇게 하면 두 파일이 모두 정렬된 다음 uniq -d중복된 줄만 인쇄됩니다. 그러나 이는 두 파일 자체에 중복된 줄이 없는 경우 허용되며, 그렇지 않은 경우 두 파일에 중복된 줄이 있어도 다음은 항상 허용됩니다.

uniq -d <(sort <(sort -u file1) <(sort -u file2))

답변2

Linux에서 실행 중이므로 GNU/Linux이고 GNU diff명령을 사용하고 있다고 가정합니다.

GNU 명령을 실행하는 경우 다음을 diff사용하여 변경된 줄과 공통 줄을 모두 볼 수 있습니다.

diff \
--old-line-format='-%l
' \
--new-line-format='+%l
' \
--unchanged-line-format=' %l
' \
"$@"

이는 기존 출력과 유사 diff하지만 출력에 파일 이름이나 구분선이 표시되지 않고, 이전 줄이 표시되고 -, 새 줄 앞에 접두사가 붙고 +, 일반 줄 앞에 공백이 붙습니다 .

다음은 샘플 셸 스크립트와 테스트 파일의 결과 출력입니다.

$ cat diffcomm.sh
#!/bin/sh
diff \
--old-line-format='-%l
' \
--new-line-format='+%l
' \
--unchanged-line-format=' %l
' \
"$@"
$ cat > filea
a
b
c
d
$ cat > fileb
a
z
d
$ ./diffcomm.sh  filea fileb
 a
-b
-c
+z
 d
$

각 라인 유형에 대한 출력 형식을 수정할 수 있습니다.

를 참고 man diff하시거나info diffGNU 차이점 문서더 많은 정보를 알고 싶습니다.

관련 정보