【发布时间】:2013-01-27 23:33:29
【问题描述】:
如果 $4 是 1,我想从文本文件中删除行
123 34 A 0
23 45 A 1
36 5 A 36
176 3 A 1
想要的输出
123 34 A 0
36 5 A 36
我需要就地编辑。如何使用 awk 或 sed 执行此操作?
【问题讨论】:
如果 $4 是 1,我想从文本文件中删除行
123 34 A 0
23 45 A 1
36 5 A 36
176 3 A 1
想要的输出
123 34 A 0
36 5 A 36
我需要就地编辑。如何使用 awk 或 sed 执行此操作?
【问题讨论】:
在awk:
awk '$4 != 1'
在sed 中是可行的,但要困难得多,我不会打扰:
sed '/^[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *1 *$/d'
或者,如果你有 GNU sed:
sed -r '/^[^ ]+ +[^ ]+ +[^ ]+ +1 *$/d'
【讨论】:
awk file > tmp && mv tmp file,但幸运的是,即将发布的 gawk 版本将支持就地编辑,这样我们就可以停止这种疯狂......
sudo sed -i '...' 与sudo sh -c "awk '...' a > b && mv b a" 相比看起来更干净一些,虽然是的,但效果最终是相同的。处理 awk 内部的任何引用是我开始发现的不便之处,尤其是在有大量 print 和 printf 语句时。
sudo sed -i '...',为什么不写sudo awk '...' 避免sh -c "..." 的复杂性?
一种使用GNU sed 和-i 就地编辑和-r 扩展正则表达式的方法:
sed -ri '/^\S+\s+\S+\s+\S+\s+1( |$)/d' file
如果您迫切需要就地编辑,您可能还想尝试perl 的自动拆分功能。该代码也更具可读性和可移植性:
perl -i -ane 'print if $F[3] != 1' file
结果:
123 34 A 0
36 5 A 36
【讨论】:
\S 和\s 符号吗?它们来自 PCRE,但Regular Expressions 和 Extended Regular Expressions 上的 GNU sed 手册页没有提及这些符号。会不会有文档错误?
\S 和\s 是ERE(和PCRE)。我也认为更多的文档是一件好事。
\s 或 \S 符号,并且您建议的 sed 命令不起作用,因此.
sed 版本吗?我相信你可能把你的安装搞混了。我可以确认给定的命令将与 GNU sed version 4.2.1 一起使用,它早于你的日期 - 我非常怀疑对 \S 和 \s 的支持会被贬低。那将是愚蠢的。该符号实际上是标准的(作为 ERE),我之前已经看过很多像 this 这样的答案。
只是为了与众不同……
$ ed << \eof
g- 1$-d
w
q
eof
【讨论】:
使用 awk
awk '{if($4 != 1 ) print $0}' temp.txt
【讨论】:
awk '$4 != 1 { print $0 }',使用awk 支持的显式模式动作表示法。你有一切行动;我的回答很有规律;这里的版本既有模式又有动作。 $0 当然是可选的;一个普通的print 无论如何都会打印$0。