행 내의 모든 열이 $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짧은 awk스크립트 및 a해당 변수를 전송합니다.b-v

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

a및 와 다른 필드가 없으면 b아무 일도 발생하지 않습니다(행이 인쇄되지 않음).

답변2

올바른 정규식 선택을 통해 원하는 결과를 얻을 수 있습니다. 참고: 쉘 변수에 평범한 문자가 있다고 가정합니다. 이는 정규식 특수 문자로 해석할 수 없는 문자를 의미합니다. 이것이 사실이 아닌 경우 \Q...\E컨텍스트에 따라 변수를 입힐 수 있습니다.

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

관련 정보