【发布时间】:2014-01-03 04:55:59
【问题描述】:
我有一个包含 6 列的文本文件。如何从该文件中删除最后三列?
c1 c2 c3 c4 c5 c6
想要的输出
c1 c2 c3
【问题讨论】:
我有一个包含 6 列的文本文件。如何从该文件中删除最后三列?
c1 c2 c3 c4 c5 c6
想要的输出
c1 c2 c3
【问题讨论】:
如果间距不重要,这里是删除最后 3 个字段的方法。
awk '{NF-=3}1' file
c1 c2 c3
你甚至可以使用
awk 'NF-=3' file
但它没有第一个例子那么健壮。
【讨论】:
如果列由单个空格分隔:
cut -d " " -f1-3 file
如果列被多个空格分隔:
tr -s " " file | cut -d " " -f1-3
如果列由制表符分隔:
cut -f1-3 file
【讨论】:
你可以使用@paxdiablo的awk来减少NF的值
您也可以使用sed
sed 's/\([ \t]\+[^ \t]*\)\{3\}$//' your_file
如果您在 Linux 上,GNU sed 提供 -r
sed -r 's/([ \t]+[^ \t]*){3}$//' your_file
【讨论】:
NF 减少 3。
NF 会更好,谢谢。
纯 bash(如果间距不重要):
tr -s ' ' < file | rev | cut -d' ' -f4- | rev
如果有尾随空格,请使用cut -d' ' -f5-,或在这些空格之前修剪尾随空格。
但我确实更喜欢 Jotne/paxdiablo 的 awk NF 解决方案。
【讨论】:
要删除每行中最后的N 列,您可以简单地将NF(字段数)减少该数量,同时考虑到没有足够的列可以删除的特殊情况):
pax> echo c1 c2 c3 c4 c5 c6 | awk -vN=3 '{if(NF<N){NF=0}else{NF-=N}print}'
c1 c2 c3
请记住,awk 主要是一种用于处理数据列的工具。您会注意到我的输出在字段之间有一个空格,因为基于列的处理通常不关心空格的类型。
如果间距很重要(例如,您希望保留列之间的空格数),您可能应该考虑使用其他工具。
【讨论】:
awk,之前我想将最后 3 列设置为空,这将留下空格字符,并且没有考虑少于 3 列的行,谢谢。但是你可以使用'{if(NF<N){NF=0}else{NF-=N}}1'而不是'{if(NF<N){NF=0}else{NF-=N}print}'
awk 这样的工具来处理字段。
awk '{print $1 " " $2 " " $3}' filename > filename.new
【讨论】:
delete last 3 columns from a file 就可以了。和Backspace 一样:)