我有一个看起来像这样的文件
18DMA H 9996 0.886 5.687 5.320
18DMA H 9997 1.019 5.764 5.247
18DMA Np 9998 0.947 5.584 5.151
18DMA H 9999 1.033 5.541 5.113
18DMA Cn10000 0.880 5.674 5.050
18DMA H10001 0.831 5.616 4.971
18DMA H10002 0.814 5.751 5.091
18DMA H10003 0.957 5.735 5.003
18DMA Cn10004 0.837 5.486 5.185
期望的输出是删除第 3 列,但是由于从某个行/行开始,接下来在原子名称和编号之间没有空格,我无法按列进行删除。有没有办法通过选择一定数量的字符来进行删除?期望的输出应该是
18DMA H 0.886 5.687 5.320
18DMA H 1.019 5.764 5.247
18DMA Np 0.947 5.584 5.151
18DMA H 1.033 5.541 5.113
18DMA Cn 0.880 5.674 5.050
18DMA H 0.831 5.616 4.971
18DMA H 0.814 5.751 5.091
18DMA H 0.957 5.735 5.003
18DMA Cn 0.837 5.486 5.185
cut
在字符模式下使用:您可能需要调整确切的字符数。同样,这假设输入不使用制表符(
\t
字符)作为分隔符(它可能不使用,因为这样你就不会首先遇到连接字段的问题)。如果有制表符,则
expand
程序可以将它们转换为空格。假设您没有
<TAB>
s 但有多个空格作为字段分隔符,并且通过查看和计算您的样本数据,我想出了它在ubstitute 命令
\1
的替换部分使用前 15 个字符的“反向引用”来恢复它们。s
这个简短
awk
的程序将对输入行执行不同的操作,具体取决于它是否包含 5 个或 6 个空格分隔的字段。如果它包含五个字段,它会删除第二个字段末尾的所有数字并保留其余部分。如果它包含六个字段,它会重写该行但省略第三个字段。
输出将以制表符分隔(或由您
OFS
在命令行上设置的任何内容分隔)。怎么用
vim
?regex
vim中的thiscommand
找到确切的模式,删除它们并将文件保存为 file1 并退出vim
。你想要的格式化的东西现在在file1
.看,最终
vim
是穷人 的sed
,,,,awk
等等。perl -e 's/.../'
tr
cut
注意:这也适用于
vi
. 爆炸前的斜线( \! )逃脱爆炸。正则表达式是 vim 风格的。如果我是你,我会先“修复”原文,然后简单地删除该列。不过,您可以一次性完成这两项操作:
该
$0=$0
分配将导致awk
重新计算(并重新拆分)当前行。与所有其他答案不同,这仅对第二个字段的可能格式做出假设,而不是关于字段的长度或数量。将使用 Tab 作为输出字段分隔符的版本:
额外的
sub(OFS OFS, OFS)
将折叠由创建的空字段$3=""
。仅当文件要由专门需要制表符分隔字段的工具或出于美学原因处理时,才需要这样做。