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

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

"행의 모든 ​​열이 $VAR1 또는 $VAR2인 경우에만 전체 행을 삭제하세요"라는 질문과 유사합니다.

그러나 전체 열을 삭제하고 열의 각 행 구성을 기반으로 합니다.

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

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

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

hajn 32 ahnnd namm X 543 asfn F
namd 90 jsnfu namm X 098 asfn S
5739 dw 32eff Sfff N asd 3123 1

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

hajn 32 ahnnd namm 543 asfn F
namd 90 jsnfu namm 098 asfn S
5739 dw 32eff Sfff asd 3123 1

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

답변1

이것 좀 보세요.

$ cat data
hajn 32 ahnnd namm X 543 asfn F
namd 90 jsnfu namm X 098 asfn S
5739 dw 32eff Sfff N asd 3123 1

if 표현식 및/또는 표현식과 함께 awk를 사용하고 ||, 그렇다면 cloumn #5를 제외하고 나머지 데이터를 인쇄합니다.

$ awk '{ if ($5=="X" || $5=="N") { $5=""; print } }' < data
hajn 32 ahnnd namm  543 asfn F
namd 90 jsnfu namm  098 asfn S
5739 dw 32eff Sfff  asd 3123 1

답변2

나는 다음 방법을 시도했고 매우 잘 작동했습니다.

VAR1="X"
VAR2="N"

Count_of_columns=`awk '{print NF}' filename| sort -nr| sed -n '$p'` 

for((i=1;i<=$Count_of_columns;i++)); do awk -v i="$i" -v VAR1="$VAR1" -v VAR2="$VAR2" '$i == VAR1||$i == VAR2{$i="";print $0}' filename; done

산출

hajn 32 ahnnd namm  543 asfn F
namd 90 jsnfu namm  098 asfn S
5739 dw 32eff Sfff  asd 3123 1

답변3

마지막 행을 검사할 때까지는 열 삭제 결정을 내릴 수 없으므로 이러한 행을 저장해야 합니다.

$ perl -lane '
    push @{$A[$.]}, @F;my $i;
    $h[$i++] ||= !/X/ && !/N/ for @F}{
    my @I2P = grep { $h[$_] } 0 .. $#h;
    print join $", @{$A[$_]}[@I2P] for 1 ..  $#A;
' inp

관련 정보