次のようにタブ区切りのファイルがあります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)
しかし、grep
、sed
または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:]]*$'