터미널에서 다음 코드를 실행하고 있습니다.
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 diff
GNU 차이점 문서더 많은 정보를 알고 싶습니다.