행의 모든 ​​열이 $VAR1 또는 $VAR2인 경우에만 전체 행을 삭제합니다.

행의 모든 ​​열이 $VAR1 또는 $VAR2인 경우에만 전체 행을 삭제합니다.

열과 행 번호가 항상 다른 텍스트 파일이 있고 그 파일의 각 열이 $VAR1 또는 $VAR2와 같은 경우에만 txt 파일에서 전체 행을 제거합니다. 예를 들어:

$VAR1="X" 및 $VAR2="N"이라고 가정하면 $VAR1 및 $VAR2가 전체 열을 구성하는 행을 삭제하고 싶습니다.

이것이 내 입력이 될 것입니다:

hajn 32 ahnnd namm 5 543 asfn F
X X N X X X N X
5739 dw 32eff Sfff 3 asd 3123 1

이것이 내가 원하는 결과입니다.

hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1

루프를 사용하여 이 문제를 해결할 수 있지만, 이를 수행하는 강력한 한 줄 방법이 있는지 알고 싶습니다. 가급적 awk를 사용하는 것이 좋습니다.

답변1

$ VAR1=N
$ VAR2=X
$ awk -v a="$VAR1" -v b="$VAR2" '{ for (i=1; i<=NF; ++i) if ($i != a && $i != b) { print; next } }' file
hajn 32 ahnnd namm 5 543 asfn F
5739 dw 32eff Sfff 3 asd 3123 1

여기서는 명령줄에서 사용할 수 있도록 값 $VAR1$VAR2짧은 스크립트 및 해당 변수를 전송합니다 .awkab-v

스크립트 내에서 각 행의 필드를 반복하고 필드가 awk합계 값과 다른 경우 전체 행을 인쇄하고 즉시 다음 행을 계속합니다.ab

a필드와 다르지 않으면 b아무 일도 일어나지 않습니다(행이 인쇄되지 않음).

답변2

정규식을 올바르게 선택하면 원하는 결과를 얻을 수 있습니다. 참고: 셸 변수에는 일반 문자가 있는 것으로 간주됩니다. 즉, 정규식 특수 문자로 해석되지 않는 문자를 의미합니다. 이것이 유지되지 않으면 \Q...\E컨텍스트에서 변수를 재정의할 수 있습니다.

$ grep -P "(^|\s)(?!$VAR1(\s|\$))(?!$VAR2(\s|\$))" inp

관련 정보