используя awk или sed для сравнения - PullRequest
1 голос
/ 27 августа 2010

У меня есть файл со следующими строками:

13:26:35.655029 (TN) sh:sdf:sdf > ra:ram:raml, type Normal (800), length 21: ID 10.1.1.1 > 20.2.2.2: Addr 77: TP
13:26:35.656029 (TN) ra:ram:raml > sh:sdf:sdf, type Normal (800), length 21: ID 20.2.2.2 >10.1.1.1: Addr 77: TP 

Мне нужно получить sh: sdf: sdf, ra: ram: raml, 10.1.1.1, 20.2.2.2 из 1-й строки иra: ram: raml sh: sdf: sdf 20.2.2.2 10.1.1.1 из второй строки.как это сделать с помощью sed или awk

Ответы [ 2 ]

1 голос
/ 27 августа 2010
awk -F"[>,)]" '{gsub(/.*ID /,"",$6);gsub(/Addr.*/,"",$7);print $2,$3,$6,$7 }' file

По сути, он устанавливает разделители полей на 3 типа символов: >, , и ).тогда $ 2, $ 3, $ 6, $ 7 будут содержать то, что вы хотите, но с некоторыми посторонними строками.Поэтому мы используем gsub(), чтобы заботиться о них.

@ OP, извините, я не могу объяснить больше.Лучше всего, если вы попробуете это в командной строке.Начните с основ,

awk -F"[>,)]" '{print $2,$3,$6,$7 }' file

распечатайте каждое поле и посмотрите, что произойдет.затем вставьте обратно операторы gsub () один за другим и посмотрите, что произойдет.

0 голосов
/ 27 августа 2010

Я не уверен, что вы можете получить различия на этом уровне от sed или awk.Возможно, вам лучше использовать Perl, Python или Ruby.Там может быть некоторое волшебство awk, которое может обработать задание, так как вы можете обрабатывать один файл как ввод и читать строку из другого файла каждую итерацию, используя getline <filename varname.Ввод / вывод файлов, отличных от входного потока, выглядит странно, если вы никогда не использовали его ранее, но вы, вероятно, могли бы заставить этот подход работать.

Вот начало полностью непроверенного сценария Awk.Прошло много времени с тех пор, как я написал что-то большее, чем однострочный в awk, так что это может быть не совсем правильно.

{
    left_line = $0
    getline <'other-file.txt' right_line
    left_count = split(left_line, left_tokens)
    right_count = split(right_line, right_tokens)
    if (left_count >= right_count)
       token_count = left_count
    else if (right_count > left_count)
       token_count = right_count
    for (token_index=0; token_index<token_count; token_index+=1) {
       if (left_tokens[token_index] != right_tokens[token_index]) {
          print left_tokens[token_index], right_tokens[token_index]
       }
    }
}
...