특정 패턴/문자열에 대한 파일을 확인하고 모든 열에 존재하는 경우 해당 행을 삭제하고 싶습니다.
예:
name1 name2 name3 name1 name1 name2 name3
name1 name2 name3 name1 name2 name1
name2 name1 name1 name2 name3 name1
name2 name2 name2 name2 name2
이 파일에서는 행 4의 모든 열에 동일한 이름이 포함되어 있으므로 행 4를 삭제하고 싶습니다.
대용량 파일이 있는데 awk 또는 grep에서 열 수를 수동으로 정의할 수 없습니다.
답변1
그리고 awk
:
awk 'NF>1 { for(i=2; i<=NF; i++) if($i != $1) { print; next } } NF<=1' file
sed
GNU 또는 최근에는 BSD 사용 sed
:
sed -E '/^[ \t]*([^ \t]+)([ \t]+\1)+[ \t]*$/d' file
답변2
그리고perl
$ perl -lane '(@a) = /$F[0]/g; print if $#F != $#a' file
name1 name2 name3 name1 name1 name2 name3
name1 name2 name3 name1 name2 name1
name2 name1 name1 name2 name3 name1
- 입력 줄을 공백으로 분할
- 첫 번째 열이 패턴으로 사용되고 필드 수가 일치 항목 수와 동일한 경우 행은 인쇄되지 않습니다.
grep
파일의 각 열 뒤에 항상 같은 수의 공백이 있는 경우 :
$ grep -vxE '(\S+\s+)\1*' file
name1 name2 name3 name1 name1 name2 name3
name1 name2 name3 name1 name2 name1
name2 name1 name1 name2 name3 name1
노트:단일 열 행이 출력의 일부가 되어야 하는 경우 다음을 사용하십시오.
perl -lane '(@a) = /$F[0]/g; print if $#F != $#a || $#F == 0' file
그리고
grep -vxE '(\S+\s+)\1+' file
답변3
Perl에서 이를 수행하는 또 다른 방법은 필드를 해시로 매핑한 다음 스칼라 컨텍스트에서 평가하여 결과 키를 계산하는 것입니다.
$ perl -ane '%names = map { $_ => 1 } @F; print unless keys %names == 1' example
name1 name2 name3 name1 name1 name2 name3
name1 name2 name3 name1 name2 name1
name2 name1 name1 name2 name3 name1
또는 더 간단하게 익명 해싱을 사용합니다.
$ perl -ane 'print unless keys %{ {map { $_ => 1 } @F } } == 1' example
name1 name2 name3 name1 name1 name2 name3
name1 name2 name3 name1 name2 name1
name2 name1 name1 name2 name3 name1