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
4

6 回答 6

26

如果分隔符是空格字符,则使用

 cut -d " " -f 1 filename

如果分隔符是制表符,则不需要 -d 选项,因为制表符是cut命令的默认分隔符

cut -f 1 filename

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

-f 指定一个字段列表,用分隔符分隔

于 2013-01-15T03:28:20.653 回答
11
 nawk '{print $1}' file > newFile && mv newFile file

或者

 cut -f1 file > newFile && mv newFile file

当您使用 SunOS 时,您会想要熟悉 nawk(不是 awk,它是 awk 的旧的、古怪的版本,而 nawk=new awk ;-)。

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

(n)awk 是一种完整的编程语言,专为轻松操作文本文件而设计。表示每行的$1第一个字段,$9 表示第九个字段,以此类推,而 $0 表示整行。您可以告诉 (n)awk 使用什么来分隔字段,它可能是制表符字符或“|” 字符或多个空格。默认情况下,所有版本的 awk 都使用空格,即多个空格或 1 个制表符来分隔文件中的每一行的列/字段。

有关 awk 的非常好的介绍,请参阅Grymoire 的 Awk 页面

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

IHTH

于 2013-01-15T03:24:34.343 回答
1

如果你有vim,用它打开文件。然后在命令模式下写入替换(制表符或空格或任何分隔符)%s:<delimiter>.*$::g。现在用:wq.

像这样使用sed给命令sed -e 's/<delimiter>.*$//' > file.txt

于 2013-01-15T03:34:58.217 回答
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';

于 2013-01-15T03:36:36.940 回答
1

尝试这个

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

输出

10.2.57.44
120.149.20.197
10.90.158.161
于 2013-01-15T04:05:51.267 回答
0
awk '{ print $1 }' file_name.txt > tmp_file_name.txt
mv tmp_file_name.txt file_name.txt

'> tmp_file_name.txt'表示重定向STDOUTawk '{ print $1 }' file_name.txt一个名为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

如果要更改分隔符,请使用awkwith-F

于 2013-01-15T03:24:23.743 回答