只有當整列中的每一行都是 $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 表達式和 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

相關內容