web-dev-qa-db-ja.com

最初の列の後のすべてを削除するUnixコマンド

私はこのようなものがあるテキストファイルを持っています-

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

誰かがIPアドレス(最初の列)だけを残してすべてを削除し、それを再びいくつかのファイルに保存できるUnixコマンドで私を助けてくれますか?.

したがって、一部のファイルでは、出力は次のようになります。

10.2.57.44
120.149.20.197
10.90.158.161
18
arsenal
 nawk '{print $1}' file > newFile && mv newFile file

OR

 cut -f1 file > newFile && mv newFile file

SunOSを使用しているときは、nawkに慣れる必要があります(awkの古くて気難しいバージョンであるawkではなく、nawk = new awk ;-)。

どちらの場合も、ファイルの最初のフィールドをnewFileに出力します。

(n)awkは、テキストファイルを簡単に操作するために設計された完全なプログラミング言語です。 $1は各行の最初のフィールドを意味し、$ 9は9番目のフィールドなどを意味し、$ 0は行全体を意味します。 (n)awkにフィールドを区切るために何を使用するかを指示できます。タブ文字または「|」の可能性があります。 char、または複数のスペース。デフォルトでは、awkのすべてのバージョンで、ファイル内の行ごとに空白、つまり複数のスペース、または1つのタブを使用して、列/フィールドを区切ります。

Awkの非常に優れた紹介については、 GrymoireのAwkページ を参照してください。

&&は、前のコマンドが問題なく終了した場合にのみ、次のコマンドを実行することを意味します。このようにして、エラーが発生したために、誤って適切なデータファイルを消去しないようにします。

IHTH

10
shellter

区切り文字がスペース文字の場合

 cut -d " " -f 1 filename

区切り文字がタブ文字の場合、タブはcutコマンドのデフォルトの区切り文字であるため、-dオプションは不要です。

cut -f 1 filename

-d区切り文字; -dオプションの直後の文字はフィールド区切り文字です。

-f区切り文字で区切られたフィールドリストを指定します

22
Mudassir Hasan

これを試して

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

出力

10.2.57.44
120.149.20.197
10.90.158.161
1
Mirage

vimがある場合は、それを使用してファイルを開きます。次に、コマンドモードで置換(タブまたはスペース、または区切り文字は何でも)%s:<delimiter>.*$::gを書き込みます。次に、:wqを使用してファイルを保存します。

このようなsed giveコマンドを使用するsed -e 's/<delimiter>.*$//' > file.txt

1
Mukund K Roy

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
DavidG
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.txtSTDOUTtmp_file_name.txtという名前のファイルにリダイレクトすることを意味します

FYI:

$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

区切り文字を変更する場合は、awk-Fとともに使用します

0
Suku