如何从 TSV 文件中删除列为空或全部空白的行?

如何从 TSV 文件中删除列为空或全部空白的行?

我有一个制表符分隔的文件,例如myfile.tsv

abc\tfoo
xyz\tbar

但有时,它有一些空白列,例如

abc\tfoo
xyz\tbar
what\t
\tthe
bleep\tsleep

IE

$ printf "abc\tfoo\n" > myfile.tsv
printf "xyz\tbar\n" >> myfile.tsv
printf "what\t\n" >> myfile.tsv
printf "\tthe\n" >> myfile.tsv
printf "bleep\tsleep\n" >> myfile.tsv

$ cat myfile.tsv 
abc foo
xyz bar
what    
    the
bleep   sleep

我可以编写一个 python 脚本来删除列为空的行,例如

with open('myfile.tsv') as fin:
    for line in fin:
        x, y = line.strip().split('\t')
        x = x.strip()
        y = y.strip()
        if x and y:
            print(line)
            

我如何对一些 unix shell 命令执行相同的操作,例如grepsedawk其他命令。


我也尝试过类似的事情grep

grep -e ".\t." myfile.tsv 

这似乎可行,但如果列有空格,则不会。

$ printf "abc\tfoo\n" > myfile.tsv
printf "xyz\tbar\n" >> myfile.tsv
printf "what\t  \n" >> myfile.tsv
printf "  \tthe\n" >> myfile.tsv
printf "bleep\tsleep\n" >> myfile.tsv

$ grep -e ".\t." myfile.tsv       
abc foo
xyz bar
what      
    the
bleep   sleep

答案1

使用米勒 ( mlr):

$ cat -t myfile.tsv
abc^Ifoo
xyz^Ibar
^I
what^I
^Ithe
bleep^Isleep
$ mlr --tsv filter 'bool empty=false ; for (k,v in $*) { empty = is_empty(v); empty { break }  } !empty' myfile.tsv
abc     foo
xyz     bar
bleep   sleep

中的等效内容awk

$ awk -F '\t' '{ empty = 1; for (i = 1; i <= NF; ++i) if (empty = (length($i) == 0)) break }; !empty' myfile.tsv
abc     foo
xyz     bar
bleep   sleep

答案2

使用sed

$ sed -E '/^\t|\t$/d' myfile.tsv
abc     foo
xyz     bar
bleep   sleep

答案3

要删除该行上的所有字段仅包含空格、制表符或为空的行,您可以匹配并排除包含以下内容的行只有空格

grep -v '^[[:space:]]*$'

相关内容