類似於問題“僅當其中的每一列都是 $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