通过awk删除空列
我有一个以制表符分隔的输入文件,但我想删除所有空列。空列:$13=$14=$15=$84=$85=$86=$87=$88=$89=$91=$94 输入:超过90列的tsv文件通过awk删除空列,awk,printing,is-empty,Awk,Printing,Is Empty,我有一个以制表符分隔的输入文件,但我想删除所有空列。空列:$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 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"} {$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
删除所有空列: 如果您有一个以制表符分隔的文件,其中有空列,并且希望删除所有空列,则表示您有多个连续的制表符。因此,如果同时删除了第一列,则可以使用单个选项卡替换这些选项卡,然后删除第一个起始选项卡:
sed 's/\t\+/\t/g;s/^\t//' <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>
awk'BEGIN{FS=OFS=“\t”;n=split(col,a,“,”)}
{for(i=1;我不清楚,请您在问题中更清楚一点。您的意思是您有多个列要为空吗?并且您不想硬编码它们?我在文件中有一些空列。我不想在输入中使用它们。所以删除空(空白)带有awk的列。这意味着您需要清空输入文件中的列,并保持输入文件本身的更改正确?请您提问,以显示一个简洁、可测试的示例输入和预期的输出,以便我们可以帮助您。您不需要带有90+列的输入来演示您的问题-5或6可以正常工作。@Sundeep no,因为这将在我们尝试删除其他特定字段之前,ld删除碰巧为空的字段。如果删除的字段是行中的第一个字段,则它也不会删除前导选项卡。什么?!很好!!++ve用于很好的解决方案Ed,你太棒了。很好的Ed..工作完美..谢谢you@Ed莫顿,很抱歉打扰你,你能解释一下吗财政司司长“RS
regex,将非常感谢您。我将用RS替换每个目标字段的内容,这样我就可以删除每个RS加上它前面的FS,而保留其余的字段+分隔符不变。但是,如果目标字段是第一个字段,那么它前面就不会有FS,因此我可以通过删除^RS
来适应这一点ell asFS RS
。
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>