我有一个制表符分隔的文件,例如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 命令执行相同的操作,例如grep
、sed
或awk
其他命令。
我也尝试过类似的事情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:]]*$'