我有一個很大的以冒號分隔的文字文件,其中包含兩列,如下所示:
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
:將下一行輸入追加到模式空間中