Unix에서 파일의 처음 두 열에서 동일한 값을 가진 행을 삭제하는 방법은 무엇입니까?

Unix에서 파일의 처음 두 열에서 동일한 값을 가진 행을 삭제하는 방법은 무엇입니까?

여러 열이 포함된 파일이 있습니다. 첫 번째 열과 두 번째 열이 동일한 값을 표시하는 이 파일에서 전체 행을 제거하고 싶습니다.

예를 들어 내 파일은 다음과 같습니다.

Variant         rsid         chr     pos
1:10177_A_AC    rs367896724     1    10177
1:10352_T_TA    rs201106462     1    10352
1:10511_G_A     rs534229142     1    10511
1:10616_CCGCCGTTGCAAAGGCGCGCCG_C        1:10616_CCGCCGTTGCAAAGGCGCGCCG_C        1       10616

열의 값이 열과 Variant동일한 행을 삭제하고 싶으 rsid므로 다음과 같은 최종 파일을 얻고 싶습니다.

Variant         rsid         chr     pos
1:10177_A_AC    rs367896724     1    10177
1:10352_T_TA    rs201106462     1    10352
1:10511_G_A     rs534229142     1    10511

다음 명령을 실행해 보았습니다.

awk '$1==$2{sed -i} input.file > output.file

awk -F, '$1==$2' input.file > output.file

그러나 그들 중 누구도 작동하지 않습니다.

이 문제를 어떻게 사용 awk하거나 해결할 수 있습니까 sed?

답변1

당신은 거의 성공했습니다

awk '$1!=$2' input.file > output.file

이렇게 하면 첫 번째 필드와 두 번째 필드가 다른 행이 유지됩니다(따라서 동일할 경우 제거됨).

  • -F,,필드 구분 기호가 아니기 때문에 이 설정으로 인해 awk가 줄 내용을 오해하게 됩니다.
  • '$1==$2{sed -i}awk나 sed 기능이 아닙니다.

답변2

넌 이미 가지고있다가장 좋은 일반적인 답변하지만 특정 경우에는 두 번째 필드가 다음으로 시작하는 모든 행을 간단히 선택할 수도 있습니다 rs.

$ awk '$2 ~ /^rs/' file
Variant         rsid         chr     pos
1:10177_A_AC    rs367896724     1    10177
1:10352_T_TA    rs201106462     1    10352
1:10511_G_A     rs534229142     1    10511

답변3

파일 작업에서 "영리한" 작업을 수행해야 하는 때가 올 수 있으며(이런 날은 결코 오지 않을 수도 있음) Awk 솔루션이 극도로 복잡해집니다. 일회성 작업을 위한 스크립트를 작성할 필요는 없지만 Awk 경험을 기반으로 한 스크립트를 작성할 필요가 있습니다. 당신은 하나를 원한다펄 원라이너.

이는 위 명령과 동일합니다( -a플래그는좋아해)

perl -anE 'print if $F[0] ne $F[1]' input.file > output.file

또는

perl -anE 'print if $F[1] =~ /^rs/' input.file > output.file

파일을 그 자리에서 변경하려면,

perl -i.bak -anE 'print if $F[0] ne $F[1]' input.file

변경사항이 적용되고 input.file백업이 유지됩니다.input.file.bak

파일을 완성한 후 일부 코드를 실행하려면 "kissing" 연산자를 사용해 보세요.}{

perl -i.bak -anE 'if ($F[0] ne $F[1]) {print} else {$del++} }{ $del ||= 0; say "Deleted $del lines"' input.file

저자는Perl 한 줄 설명설명도 썼다그리고이것이 유용할 수도 있습니다.

답변4

#!/usr/bin/python
m=open('filename','r')
import re
h=re.compile(r'\s+')
for b in m:
    fg=re.sub(h," ",b)
    rt=fg.split(' ')
    if (rt[0] != rt[1]):
        print fg

산출

Variant rsid chr pos 
1:10177_A_AC rs367896724 1 10177 
1:10352_T_TA rs201106462 1 10352 
1:10511_G_A rs534229142 1 10511 

관련 정보