Shell-Script
如何不顯示文件中包含所有 NULL 值的列
我有一個文件,比如說 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 ...