Замена одного теста представляет в виде строки с другим в особенности столбец

#!/usr/bin/perl
use strict;
use warnings;

my %count;

# extract protocol and source-ip-address, count rows with same values
while(<>) {
  if (/^([^ ]+).*src=([0-9.]+)/) {
    $count{"$1 $2"}++;
  }
}

# sort by count
for my $p_src (sort {$count{$b} <=> $count{$a}} keys %count) {
  print "$p_src\t$count{$p_src}\n";
}

Пример (Ваши данные не очень интересны),

$ eg.pl eg.txt
tcp 67.201.31.35        1
tcp 80.132.51.190       1
tcp 80.132.51.194       1
udp 192.168.1.201       1
udp 91.120.112.125      1
udp 98.196.37.3 1
udp 98.196.37.7 1
0
17.03.2014, 09:02
3 ответа
awk -F'\t' -vOFS='\t' '{ gsub("CC", "C", $1) ; gsub("AA", "A", $1) ; print }'

Замена $1 со столбцом, который Вы хотите изменить.

5
28.01.2020, 02:17
  • 1
    В случае, если разделитель должен быть сохранен, a -vOFS='\t' опция может быть добавлена. положительная сторона –  manatwork 14.06.2012, 13:18
  • 2
    @manatwork, добавил. фантастический –  Chris Down 14.06.2012, 13:20
  • 3
    ! работы как обычно!!! –  alex 14.06.2012, 13:51
  • 4
    Некоторые версии awk не имейте a gsub функция. Как Вы сделали бы это затем? Может sed использоваться вместо этого? –  rahmu 14.06.2012, 16:33
  • 5
    @rahmu - gsub() определялся POSIX больше 20 лет, таким образом, мое предложение должно будет получить версию awk, который не является совершенно ужасным ;-) –  Chris Down 14.06.2012, 16:40

Если у вас не было доступа к [11710]gsub()[11711], но у вас был доступ к [11712]split()[11713], вы могли бы просто создать эквивалент таким образом: [12187]С помощью следующего скрипта [11714]awk[11715] [12189] можно было бы получить желаемые результаты для полей 1, 3 и 5:[12190] Даже без [11716]split()[11717] это возможно, если вы хотите жестко закодировать [11718]Fields[11719] и [11720]Replacements[11721] массивы в блоке [11722]BEGIN[11723].

0
28.01.2020, 02:17

Чтобы найти и заменить в одном поле, используйте эту команду:

sed 's/whatyouwanttofind/whatyouwanttoreplace/field#'

т.е. вы повторяете это:

$echo -e "1are,2are,3are,4are\n5are,6are,7are,8are"

1are,2are,3are,4are

5are,6are,7are,8are

и хотите сделать это

$echo -e "1are,2are,3are,4are\n5are,6are,7are,8are" |  sed 's/are/arrr/2'

1are,2**arrr**,3are,4are

5are,6**arrr**,7are,8are
0
28.01.2020, 02:17

Теги

Похожие вопросы