3

我正在 unix 系统上进行一些文本处理。我可以访问这台机器上的命令行,它安装了 Python、Perl 和默认的文本处理程序、awk 等。

我有一个如下所示的文本文件:

2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 
2029754527851451717 1232453488239 Tue Mar  3 10:47:44 2009
2029754527851451717 1232453488302 Tue Mar  3 10:47:44 2009
2029754527851451717 1232453488365 Tue Mar  3 10:47:44 2009
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
2895635937120524206 
5622983575622325494 1232453323986 Thu Feb 12 15:57:49 2009

它基本上是 3 行: ID ID 日期

我希望删除所有没有 2 个 ID 和日期的行。所以最终的结果会是这样的:

2029754527851451717 1232453488239 Tue Mar  3 10:47:44 2009
2029754527851451717 1232453488302 Tue Mar  3 10:47:44 2009
2029754527851451717 1232453488365 Tue Mar  3 10:47:44 2009
5622983575622325494 1232453323986 Thu Feb 12 15:57:49 2009

你们如何建议这样做?文本文件总共长约 30,000 行。

干杯

伊夫

4

9 回答 9

14

awk

awk 'NF > 2' input_file > output_file
于 2009-04-27T14:43:13.410 回答
8
grep ':' filename
于 2009-04-27T14:49:24.987 回答
5
with open(source_filename) as src:
    with open(dest_filename, 'w') as dst:
        for line in src:
            if len(line.split()) > 1:
                dst.write(line)
于 2009-04-27T14:42:29.260 回答
4

使用 Perl:

perl -ne 'print if /^([0-9]+\s+){2}.+$/' $filename
于 2009-04-27T14:43:53.517 回答
3

只是在这里工作我的 perl,但这也可能有帮助:

perl -lane 'if (scalar(@F) == 3) { print @F;}' file >> file.out
于 2009-04-27T15:06:35.880 回答
2

使用 Python:

file = open(filename, 'r')
lines = file.readlines()
file.close()

p = re.compile('^\d*$')

for line in lines:
    if not p.search(line): print line,
于 2009-04-27T14:37:36.277 回答
1
awk "NF>1" < filename
于 2009-04-27T14:47:22.307 回答
1
perl -i -lane 'print if($F[1])' file
于 2013-08-08T10:36:10.873 回答
-1
sed '/^[0-9]$/d'  filename

(如果坏行有尾随空格,可能必须修改模式)。您也可以使用 grep -v,它将省略匹配的模式。

于 2009-04-27T14:44:24.343 回答