Shell-Script

如何不顯示文件中包含所有 NULL 值的列

  • May 24, 2019

我有一個文件,比如說 5 列(通過重定向 Sybase 選擇查詢的結果獲得)。每列由一個製表符分隔。我需要過濾掉所有為 NULL 的列。五列中的任何列都可以為空。

例如,如果文件中的列如下所示:

1000    NULL    NULL    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL
7       NULL    1000    2       NULL

輸出必須是(在刪除第 2 列和第 5 列之後),最好在同一個文件中:

1000    NULL    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2    
7       1000    2 

我到了:

for i in {1..5}  
do
echo $i
dlr="$"$i
str="{print $dlr}"
echo $str
awk '$str' <input_file> | while read value
   do
       echo $value

       if [ "$value" == "NULL" ]
       then
               echo "inside"
               cut $i 
       fi
   done
done

現在的值,顯示所有行!!!另外,我不知道如何切斷列。我是一個 shell 腳本初學者,無法繼續。

你能告訴我怎麼做嗎?

通過GNU 實用程序datamash,您首先反轉行,然後刪除所有空行並再次反轉行:

$ datamash transpose | sed -Ee '/^(NULL\t)*NULL$/d' | datamash transpose 

如果不處理文件兩次,您將無法做到這一點。以下是首先使用awk來構造最終cut命令:

killnulls(){
   cut -f "$(awk -F'\t' '
       { for(i=1;i<=NF;i++) a[i] += $i!="NULL" }
       END { for(i=1;i in a;i++) if(a[i]) printf j++?","i:i }
   ' "$@")" "$@"
}

$ killnulls file
1000    NULL    2
7       1000    2
7       1000    2
...

引用自:https://unix.stackexchange.com/questions/520873