如果有人问过/回答,我道歉;我无法通过搜索找到答案。
我有一个很长的文本文件,只有一小部分行在第4列中有值,这就是我关心的。我怎样才能打印那些线?
这是我的数据:
gi|254160123|ref|NC_012967.1| 585236 C
gi|254160123|ref|NC_012967.1| 585237 C
gi|254160123|ref|NC_012967.1| 585238 A
gi|254160123|ref|NC_012967.1| 585239 C 4
gi|254160123|ref|NC_012967.1| 585240 A
gi|254160123|ref|NC_012967.1| 585241 A
gi|254160123|ref|NC_012967.1| 585242 C
gi|254160123|ref|NC_012967.1| 585243 T 16
gi|254160123|ref|NC_012967.1| 585244 G 6
gi|254160123|ref|NC_012967.1| 585245 C 2
gi|254160123|ref|NC_012967.1| 585246 G 3
gi|254160123|ref|NC_012967.1| 585247 C 9
我想只打印第四列中有值的行(本例中为行4,8,9,10,11,12)。
答案 0 :(得分:2)
由于您尚未发布数据文件样本,我将为您提供一个如何使用awk实现特定列提取的通用示例...您可以使用gawk(gnu-awk)作为
好吧,概念类似,假设您有一个文件(BBS列表),
alpo-net 555-3412 2400/1200/300 A
bites 555-1675 2400/1200/300 A
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sdace 555-3430 2400/1200/300 A
sabafoo 555-2127 1200/300 C
如果您要打印带有第一列记录的第二列' EXACT'匹配' foo'
你可以使用 -
$ awk '$1 == "foo" { print $2 }' BBS-list
但由于他们是fooey,macfoo,sabafoo等等你不会得到任何输出。
这是模式匹配,而不是" foo"你可以使用,模式匹配/ foo /
$ awk '$1 ~ /foo/ { print $2 }' BBS-list
结果将是fooey,foot,macfoo和sabafoo,
555-1234
555-6699
555-6480
555-2127
示例礼貌(犹他大学)
因此,为了隔离你可以使用的NULL,
awk '$2==""' myfile.txt //$2 means third column (as you asked)
但是在对我的系统进行研究和测试后,我感到困惑的是我无法使用 awk 隔离空值。它无法区分NULL和Space。问题是你必须特别提到分隔符。最好的方法是使用标签作为字段分隔符。因此你可以使用,
awk 'BEGIN {FS="\t"} $2=="" {print}' myfile.txt
我认为这应该可以解决你的困境。
答案 1 :(得分:0)
只需使用 awk 即可打印包含四个字段的行:
awk 'NF==4' /path/to/input # Num Fields == 4
默认情况下, awk 会忽略前导和尾随空白(在常见的语言环境中,这意味着“空格和制表符”)。因此,您所需的记录将被视为包含四个字段(1st
< tab> 2nd
< tab> 3rd
< tab> 4th
< tab> ),而其他人将有三个(1st
< tab> 2nd
<标签> 3rd
<标签><标签> )。如果未指定 awk “action”,则默认操作是打印当前行。
答案 2 :(得分:0)
因为您要求使用Python的解决方案,所以这是一个。它读取文件的每一行,然后将其拆分为空白的列;如果第四个(索引3)之后的列为空,则不会打印。
with open(filename, 'r') as f:
for line in f:
if line.split()[3:]:
print line
在使用列式文件时,您可能会发现csv
module更加健壮,但对于所述问题而言,这有点过分,并且不会保留输入的格式。