열과 행 번호가 항상 다른 텍스트 파일이 있고 그 파일의 각 열이 $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