Unix命令:删除第一列后的所有内容

19

我有一个文本文件,其中有如下内容 -

10.2.57.44      56538154    3028
120.149.20.197  28909678    3166
10.90.158.161   869126135   6025

在这个文本文件中,我有大约1,000,000行正如上面所示。我正在SunOS环境中工作。我需要一种方法从那个文本文件中删除所有内容,只留下IP地址(上面的文本文件的第一列是IP地址)。因此,在运行了一些UNIX命令后,该文件应该看起来像下面这样。

10.2.57.44
120.149.20.197
10.90.158.161

有没有人可以帮我提供一些Unix命令,可以删除所有东西,只留下IP地址(第一列),然后将其保存回某个文件中。

因此,输出应该是在某个文件中如下所示 -

10.2.57.44
120.149.20.197
10.90.158.161

如果在SunOS上可用,awk可以轻松完成此任务。 - louxiu
6个回答

26
如果分隔符是空格字符,则使用。
 cut -d " " -f 1 filename

如果分隔符是制表符,则无需使用 -d 选项,因为制表符是 cut 命令的默认分隔符。

cut -f 1 filename

-d 分隔符;-d选项后紧接的字符是字段分隔符。

-f 指定由分隔符分隔的字段列表。


2
这绝对是最好的解决方案。可惜它不是被接受的答案,而且还有许多荒谬复杂的替代方案。 - mgadda

11
 nawk '{print $1}' file > newFile && mv newFile file

或者

 cut -f1 file > newFile && mv newFile file

由于您使用的是SunOS,因此您需要熟悉nawk(不是awk,它是awk的旧版本,比较老派,而nawk是新版awk;-)。

无论哪种情况,您都将第一个字段打印到newFile中。

(n)awk是一种完整的编程语言,专门用于简化文本文件的操作。 $1 表示每行上的第一个字段,$9表示第九个字段等等,而 $0 表示整行。您可以告诉(n)awk使用什么来分隔字段,可能是制表符,或者是'|'字符,或多个空格。默认情况下,所有版本的awk使用空格,即多个空格或1个制表符来分隔文件中每行的列/字段。

关于awk的非常好的介绍,请参见Grymoire's Awk page

&& 的意思是,只有在上一个命令没有问题地完成时才执行下一个命令。这样你就不会因为某些错误而意外删除你的好数据文件。

IHTH


所以这应该没问题,对吧? awk '{ print $1 }' DEipsjan.txt > DE-IP-List.txt - arsenal
考虑到您使用的是SunOS,我更喜欢使用“新”awk,即nawk。(awk可以用于您的第一个案例,但无法提供良好的错误消息)。 - shellter

1

一个perl脚本怎么样;)

#!/usr/bin/perl -w
use strict;

my $file = shift;
die "Missing file or can't read it" unless $file and -r $file;

sub edit_in_place
{
    my $file       = shift;
    my $code       = shift;
    {
        local @ARGV = ($file);
        local $^I   = '';
        while (<>) {
            &$code;
        }
    }
}

edit_in_place $file, sub {
    my @columns = split /\s+/;
    print "$columns[0]\n";
};

由于您说这是一个大文件,因此这将直接编辑该文件。您还可以通过修改 local $^I = '';local $^I = '.bak'; 来创建备份。


1

请尝试以下命令

awk '{$1=$1; print $1}' temp.txt

输出结果

10.2.57.44
120.149.20.197
10.90.158.161

1
这可以缩短为 awk '{print $1}' temp.txt - pjvds

1

如果您有vim,请使用它打开文件。然后在命令模式下编写替换命令(制表符、空格或其他分隔符)%s:<delimiter>.*$::g。现在使用:wq保存文件。

使用sed给出以下命令:sed -e 's/<delimiter>.*$//' > file.txt


0
awk '{ print $1 }' file_name.txt > tmp_file_name.txt
mv tmp_file_name.txt file_name.txt

'> tmp_file_name.txt' 是将 awk '{ print $1 }' file_name.txtSTDOUT 重定向到名为 tmp_file_name.txt 的文件。

顺便说一句:

$1 means first column based on delimiter. The default delimiter is whitespace
$2 means second column based on delimiter. The default delimiter is whitespace
..
..
$NR means last column based on delimiter. The default delimiter is whitespace

如果你想改变分隔符,可以使用带有-F参数的awk


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接