TSVファイルから列が空またはすべて空の行を削除する方法は?

TSVファイルから列が空またはすべて空の行を削除する方法は?

次のようにタブ区切りのファイルがありますmyfile.tsv

abc\tfoo
xyz\tbar

ただし、時には次の空の列がある場合があります。

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

つまり

$ 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)
            

しかし、grepsedまたはawk他のコマンドなどの一部のUnixシェルコマンドで同じことを行うにはどうすればよいですか?


私も同様のことを試しました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:]]*$'

関連情報