Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过awk删除空列_Awk_Printing_Is Empty - Fatal编程技术网

通过awk删除空列

通过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

我有一个以制表符分隔的输入文件,但我想删除所有空列。空列:$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"} {$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 as
FS 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>