Подтвердить что ты не робот

Команда 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

Кто-нибудь может помочь мне с некоторой командой Unix, которая может удалить всю вещь, оставляя только IP-адрес (первый столбец) и снова сохранить его в файле.

Таким образом, в каком-то файле вывод должен быть примерно таким -

10.2.57.44
120.149.20.197
10.90.158.161
4b9b3361

Ответ 1

 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, что использовать для разделения полей, это может быть вкладка char или '|' char или несколько пробелов. По умолчанию все версии awk используют пробел, т.е. Несколько пробелов или 1 вкладку, чтобы разграничить столбцы/поля в строке в файле.

За очень хорошее введение в awk см. Страница Grymoire Awk

&& означает, выполнить следующую команду, только если предыдущая команда завершилась без проблем. Таким образом, вы случайно не удаляете свой хороший файл данных из-за некоторой ошибки.

IHTH

Ответ 2

Если разделителем является использование символа пробела

 cut -d " " -f 1 filename

Если разделитель является символом табуляции, не нужно использовать параметр -d в качестве разделителя по умолчанию для команды cut

cut -f 1 filename

-d Разделитель; символ, следующий за опцией -d, является разделителем полей.

-f Задает список полей, разделенных разделителем

Ответ 3

Если у вас vim, откройте файл вместе с ним. Затем в командном режиме пишите для замещения (вкладка или пробел или что-то другое) %s:<delimiter>.*$::g. Теперь сохраните файл с помощью :wq.

Используя sed, выполните команду, подобную этой sed -e 's/<delimiter>.*$//' > file.txt

Ответ 4

Как насчет perl script;)

#!/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';

Ответ 5

Попробуйте это

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

Выход

10.2.57.44
120.149.20.197
10.90.158.161

Ответ 6

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

'> tmp_file_name.txt' означает перенаправление STDOUT из awk '{ print $1 }' file_name.txt в файл с именем tmp_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