刪除任一列為空白的行

刪除任一列為空白的行

我有一個很大的以冒號分隔的文字文件,其中包含兩列,如下所示:

valueA:valueB
valueC:
valueD:valueE
:valueG

如果左邊沒有數據或者冒號右側,我想刪除整行:

valueA:valueB
valueD:valueE

我該怎麼做呢?

我最接近的是這樣的:

awk -F : '$2!=""' file > final_output

但這似乎匹配所有內容,無論該行是否包含空白列。

答案1

您的awk命令正確地保留了valueA:valueB示例valueD:valueE行,並且刪除了該valueC:行(因此我不確定您所說的“似乎匹配”是什麼意思一切”)。

該命令保留是:valueG因為您根本沒有測試第一個欄位。

“不要列印任何兩列為空的行”可以編碼awk為:

awk -F : '! ( $1=="" || $2=="" )'

此任務相當於「僅列印每列非空的行」:

awk -F : '$1!="" && $2!=""'

Noteawk是一個非常適合處理該問題的工具。我們的兩行反映了「分隔符號」( -F :)、「列」/「欄位」($1$2)「為空」( )等方面所需的邏輯…==""。表達邏輯這麼清晰。例如grep

grep '.:.'

上面的命令運作良好,而且比awk其他命令更簡單。但它的形式並不能直接反映問題的實質。雖然它的極簡主義在美學上令我滿意,但我仍然認為awk這是正確的事情。

答案2

使用 sed 和三個s指令:

sed 'N; s/\n:/:/; s/\n/:/; s/:$//' file

輸出:

值A:值B:值C
值D:值E:值G

man sed

N:將下一行輸入追加到模式空間中

相關內容