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