我有一个以冒号分隔的大型文本文件,其中包含两列,如下所示:
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
:将下一行输入附加到模式空间