여러 열이 포함된 파일이 있습니다. 첫 번째 열과 두 번째 열이 동일한 값을 표시하는 이 파일에서 전체 행을 제거하고 싶습니다.
예를 들어 내 파일은 다음과 같습니다.
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