Команда 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
Ответы
Ответ 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