Sed 删除不带';我没有4列

Sed 删除不带';我没有4列,sed,awk,Sed,Awk,我有一些文件如下。我想删除没有4列的行 263 126.9 263 50.2 264 76.6 264 6.2 265 62.3 265 49.9 266 84.2 266 18.3 7 63.8 8 59.7 9 36.4 11 12.0 期望输出 263 126.9 263 50.2 264 76.6 264 6.2 265 62.3 265 49.9 266 84.2 266 18.3 这是直截了当的 NF是字段数,如果它等于4

我有一些文件如下。我想删除没有4列的行

263 126.9   263 50.2
264 76.6    264 6.2
265 62.3    265 49.9
266 84.2    266 18.3
7   63.8
8   59.7
9   36.4
11  12.0
期望输出

263 126.9   263 50.2
264 76.6    264 6.2
265 62.3    265 49.9
266 84.2    266 18.3

这是直截了当的

NF
是字段数,如果它等于
4
,则执行默认操作,即打印整行

sed '/\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{3\}[^[:blank:]]\{1,\}/ !d'
在本示例中,使用

sed '/\([0-9.]\{1,\}[[:blank:]]\{1,\}\)\{3\}[0-9.]\{1,\}/ !d'
包括sudo_O备注(仅适用于4列)(其他允许打印更多内容)和用于列数的参数变量(必须至少为2)

正如他所说,sed不是在这种情况下使用的优化工具(请阅读参数注释)

这可能适合您(GNU-sed):


或者仅仅为了完整性'sake
grep-Ev'^[^[:space:][]+([[:space:][]+[^[:space:][]+){3}$'input.txt在一般情况下,这是错误的,因为它会打印包含五个或更多字段的行。至少有四个字段是我解释需求的方式。@pfnuesel代码运行良好。非常感谢。是否可以在awk中进行就地编辑?您能概述一下您想做什么吗?@pfnuesel请留下我的问题。我得到了在awk中进行就地编辑的解决方案。非常感谢。谢谢你的回答。我得到如下错误:sed:-e表达式#1,字符53:不匹配(或(sed:-e表达式#1,字符63:未终止的地址regex抱歉复制了一个错误的版本(缺少ans 1)。在回答中进行了更正。在gnu sed中,您可能需要--posixparameter@sudo_O:解释为什么它不是一个好工具(性能、代码读取等)对于这类工作。我不知道600个字符的限制是否足以解释所有原因。首先,可读性。看看awk解决方案,现在看看你的解决方案!即使对于
sed
专家,你的脚本所做的也不明显。其次,灵活性,如果字段分隔符更改或字段值可能包含stri,该怎么办ngs,您必须完全重写您的解决方案。
sed
不是为处理记录而设计的,
awk
是。第三,正则表达式非常昂贵,特别是当它变得很大并且不像您的那样锚定时。
Python
Perl
awk
是更好的工具!为什么值得一提的是,如果
sed
是当时系统上唯一可用的工具,那么我会使用
sed-r'/^(\s+\s+{3}\s+$/!d'文件
sed '/\([0-9.]\{1,\}[[:blank:]]\{1,\}\)\{3\}[0-9.]\{1,\}/ !d'
ColNbr=4
ColBefore=$(( ${ColNbr} - 1 ))
sed "/^\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{${ColBefore}\}[^[:blank:]]\{1,\}[[:blank:]]*$/ !d"
sed -r 's/\S+/&/4;t;d' file