'행 안의 모든 열이 $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