用awk删除空列

时间:2018-06-14 13:01:54

标签: awk printing is-empty

我有一个输入文件,它是制表符分隔的,但我想删除所有空列。空栏:$ 13 = $ 14 = $ 15 = $ 84 = $ 85 = $ 86 = $ 87 = $ 88 = $ 89 = $ 91 = $ 94

INPUT:超过90列的tsv文件

a b   d e   g...  
a b   d e   g...

OUTPUT:没有空列的tsv文件

a b d e g....
a b d e g...

谢谢

2 个答案:

答案 0 :(得分:4)

这可能是你想要的:

$ printf 'a\tb\tc\td\te\n'
a       b       c       d       e

$ printf 'a\tb\tc\td\te\n' | awk 'BEGIN{FS=OFS="\t"} {$2=$4=""} 1'
a               c               e

$ printf 'a\tb\tc\td\te\n' | awk 'BEGIN{FS=OFS="\t"} {$2=$4=RS; gsub("(^|"FS")"RS,"")} 1'
a       c       e

请注意,上述内容并未删除所有空列,因为某些可能的解决方案可能会执行此操作,它只会删除您要删除的列号:

$ printf 'a\tb\t\td\te\n'
a       b               d       e

$ printf 'a\tb\t\td\te\n' | awk 'BEGIN{FS=OFS="\t"} {$2=$4=RS; gsub("(^|"FS")"RS,"")} 1'
a               e

答案 1 :(得分:2)

删除所有空列:

如果您有一个制表符分隔的文件,其中包含空列,并且您想要删除所有空列,则表示您有多个连续的标签。因此,如果您还删除了第一列,则可以使用单个选项卡替换那些,然后删除第一个开始选项卡:

sed 's/\t\+/\t/g;s/^\t//' <file>

删除某些列:请参阅Ed Morton或仅使用cut

cut --complement -f 13,14,15,84,85,86,87,88,89,91,94 <file>

当且仅当它们为空时删除所选列:

基本上是Ed Morton的简单改编:

awk 'BEGIN{FS=OFS="\t"; n=split(col,a,",")}
     { for(i=1;i<=n;++i) if ($a[i]=="") $a[i]=RS; gsub("(^|"FS")"RS,"") }
     1' col=13,14,15,84,85,86,87,88,89,91,94 <file>