通过 awk 删除空列
Remove empty columns by awk
我有一个以制表符分隔的输入文件,但我想删除所有空列。空列:$13=$14=$15=$84=$85=$86=$87=$88=$89=$91=$94
输入:超过 90 列的 tsv 文件
a b d e g...
a b d e g...
输出:没有空列的 tsv 文件
a b d e g....
a b d e g...
谢谢
这可能是您想要的:
$ printf 'a\tb\tc\td\te\n'
a b c d e
$ printf 'a\tb\tc\td\te\n' | awk 'BEGIN{FS=OFS="\t"} {==""} 1'
a c e
$ printf 'a\tb\tc\td\te\n' | awk 'BEGIN{FS=OFS="\t"} {==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"} {==RS; gsub("(^|"FS")"RS,"")} 1'
a e
删除所有空列:
如果您有一个制表符分隔的文件,其中有空列并且您想要删除 所有 个空列,这意味着您有多个连续的制表符。因此,如果您还删除了第一列,您可以只用一个选项卡替换它们,然后删除第一个起始选项卡:
sed 's/\t\+/\t/g;s/^\t//' <file>
删除一些列: 参见 或仅使用 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>
我有一个以制表符分隔的输入文件,但我想删除所有空列。空列:$13=$14=$15=$84=$85=$86=$87=$88=$89=$91=$94
输入:超过 90 列的 tsv 文件
a b d e g...
a b d e g...
输出:没有空列的 tsv 文件
a b d e g....
a b d e g...
谢谢
这可能是您想要的:
$ printf 'a\tb\tc\td\te\n'
a b c d e
$ printf 'a\tb\tc\td\te\n' | awk 'BEGIN{FS=OFS="\t"} {==""} 1'
a c e
$ printf 'a\tb\tc\td\te\n' | awk 'BEGIN{FS=OFS="\t"} {==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"} {==RS; gsub("(^|"FS")"RS,"")} 1'
a e
删除所有空列:
如果您有一个制表符分隔的文件,其中有空列并且您想要删除 所有 个空列,这意味着您有多个连续的制表符。因此,如果您还删除了第一列,您可以只用一个选项卡替换它们,然后删除第一个起始选项卡:
sed 's/\t\+/\t/g;s/^\t//' <file>
删除一些列: 参见 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>