我有一个输入文件,它是制表符分隔的,但我想删除所有空列。空栏:$ 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...
谢谢
答案 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>