删除任一列为空的行

删除任一列为空的行

我有一个以冒号分隔的大型文本文件,其中包含两列,如下所示:

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:将下一行输入附加到模式空间

相关内容