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

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

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

그러나 대신 전체 COLUMN을 제거하는 것이며 열의 모든 ROW 구성을 기반으로 합니다.

열과 행 번호가 항상 달라지는 텍스트 파일이 있고 해당 열 내의 모든 행이 $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 표현식과 or 표현식이 포함된 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

관련 정보