在linux上使用awk或从命令行删除文件中的列
如何使用在linux上使用awk或从命令行删除文件中的列,awk,Awk,如何使用awk从选项卡分隔的字段文件中删除某些列 c1 c2 c3 ..... c60 例如,删除3到29之间的列。您可以在所有列上循环,并过滤掉不需要的列: awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt 这有两种改进方式: 保留原始的分隔符 不在末尾附加分隔符 这就是cut命令的作用: cut -f1,2,30- inputfile 默认值是tab。您可以
awk
从选项卡分隔的字段文件中删除某些列
c1 c2 c3 ..... c60
例如,删除3到29之间的列。您可以在所有列上循环,并过滤掉不需要的列:
awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt
这有两种改进方式:
- 保留原始的分隔符
- 不在末尾附加分隔符
- 这就是
cut
命令的作用:
cut -f1,2,30- inputfile
默认值是tab。您可以使用-d
开关更改此设置
awk '{for(z=3;z<=15;z++)$z="";$0=$0;$1=$1}1'
输出
c1 c2 c16 c17 c18 c19 c20 c21
不添加前导或尾随空格的Perl“splice”解决方案:
perl -lane 'splice @F,3,27; print join " ",@F' file
产生输出:
c1 c2 c30 c31
这个关于stackoverflow的答案可能会帮助您:您不应该打印一个选项卡(\t)而不是一个空格吗。他想删除字段,也许不想同时删除制表符(如果我没听错的话)。@johnny:你说得对。我更新了代码,所以它应该正确地考虑分隔符。让我们假设您编辑的答案,我们想删除列号2,5,7,8,23,45,67 2545 54 48 8。这样做的条件是什么?我有一个包含近4000列的文件@oliverI不得不删除最后一个
-
,以使其在Ubuntu中工作。如果我离开它,cut
将打印所有列。有人也有这个问题吗?它应该将第1、2和30列打印到最后一列(问题中的60列)。如果没有,那就是Ubuntu中的一个bug!啊,好的。我犯了一个错误。我的不好。如何删除特定列,例如第3列?@becko有一个通用扩展名,--complete
,它对输入字段号执行它所说的操作,例如:cut--complete-f3
。这不会删除列。它会将它们清空并重新打印。。。用指定的O*FS
of\t
替换OP的O*FS
为一个单独的空格,他们没有要求。明显的删除是巧合的,需要将FS
和OFS
作为默认的\s+
。一个非常无用的分隔符,与OP的\t
不兼容,除非他们的文件碰巧不能有空字段,因为它会将它们挤压成参差不齐的行。任何其他分隔符,例如OP的\t
,都会给出仍然包含不需要的列但现在为空的输出。而$0=$0
是多余的,可能是浪费。重建记录的文档化方法是$1=$1
perl -lane 'splice @F,3,27; print join " ",@F' file
c1 c2 c30 c31