Сравнение двух использований файлов Unix и Awk

Режим Управления системой не является единственной вещью, которая делает x86 плохо в жесткое реальное время. Непредсказуемость скорости выполнения из-за кэшей, конвейеры и так далее делают x86 и любой другой высокопроизводительный процессор, плохо в реальное время. Все эти функции, которые заставляют процессор быстро в среднем также сделать худший случай трудным справиться.

Текущее поколение микросхем ARM разделено на три ряда: Кора для высококачественных микропроцессоров (самая близкая вещь к x86), Cortex-R для приложений реального времени и Cortex-M в профиле микроконтроллера. Cortex-R не имеет MMU (у некоторых есть MPU), но может иметь кэш. Это используется во многих приложениях реального времени (ARM пытается конкурировать с DSPS, справедливо успешно).

Сама архитектура ARM не определяет ничего как SMM. Возможно, что производители микросхемы добавляют что-то как он, необходимо было бы посмотреть на документацию производителя.

3
29.07.2013, 02:52
2 ответа

Можно использовать awk. Поместите следующее в сценарий, script.awk:

FNR == NR {
  f1[$1,$2,$4] = $0
  f1_c14[$1,$2,$4] = 1
  f1_c5[$1,$2,$4] = $5
  next
}  

f1_c14[$1,$2,$4] {
  if ($5 != f1_c5[$1,$2,$4]) print f1[$1,$2,$4];
}

f1[$1,$2,$4] {
  if ($5 != f1_c5[$1,$2,$4]) print $0;
}

Теперь выполните его как это:

$ awk -f script.awk file1  file2
sc2/80         20      .        A       T         86       PASS     N=2     F=5;U=4
sc2/80         20      .        A        C        80      PASS    N=2       F=5;U=4
sc2/60         55      .        G       T         76       PASS     N=2     F=5;U=4 
sc2/60         55      .        G        C        72      PASS    N=2       F=5;U=4

Сценарий работает следующим образом. Этот блок создает 3 массива, f1, f1_c14, и f1_c5. f1 содержит все строки file1 в массиве, индексированное использование содержания столбцов 1, 2, и 4 от file1. f1_c14 другой массив с тем же индексом (1, 2, и 4's содержание) и значение 1. 3-й массив использует тот же индекс в качестве 1-х 2 со значением 5-го столбца от file1.

FNR == NR {
  f1[$1,$2,$4] = $0
  f1_c14[$1,$2,$4] = 1
  f1_c5[$1,$2,$4] = $5
  next
} 

Следующий блок ответственен за печать строк из 1-го файла, file1 при условиях, от которых столбцы 1, 2, и 4 соответствуют столбцам file2, И это будет onlu распечатать строку от file1 если 5-е столбцы file1 и file2 не соответствовать.

f1_c14[$1,$2,$4] {
  if ($5 != f1_c5[$1,$2,$4]) print f1[$1,$2,$4];
}

3-й блок ответственен за печать связанной строки от file2 в массиве существует соответствующая строка f1 для file2столбцы 1, 2, и 4. Снова это только печатает, если 5-е столбцы не соответствуют.

f1[$1,$2,$4] {
  if ($5 != f1_c5[$1,$2,$4]) print $0;
}

Пример

Выполнение вышеупомянутого сценария как так:

$ awk -f script.awk file1  file2
sc2/80         20      .        A       T         86       PASS     N=2     F=5;U=4
sc2/80         20      .        A        C        80      PASS    N=2       F=5;U=4
sc2/60         55      .        G       T         76       PASS     N=2     F=5;U=4 
sc2/60         55      .        G        C        72      PASS    N=2       F=5;U=4 

Можно использовать column управляйте для чистки вывода немного:

$ awk -f script.awk file1  file2 | column -t
sc2/80  20  .  A  T  86  PASS  N=2  F=5;U=4
sc2/80  20  .  A  C  80  PASS  N=2  F=5;U=4
sc2/60  55  .  G  T  76  PASS  N=2  F=5;U=4
sc2/60  55  .  G  C  72  PASS  N=2  F=5;U=4

Как это работает?

FNR == НОМЕР

Это использует awkспособность циклично выполниться через файлы конкретным способом. Вот, мы - цикличное выполнение через файлы и когда мы находимся на строке, это из первого файла, file, мы хотим выполнить конкретный блок кода на этой строке от file1.

Этот пример показывает что FNR == NR делает, когда мы даем ему 2 моделируемых файла. У каждого есть 4 строки в нем, в то время как другой имеет 5 строк:

$ awk 'BEGIN {print "NR\tFNR\tline"} {print NR"\t"FNR"\t"$0}' \
     <(seq 1 4) <(seq 1 5)
NR  FNR line
1   1   1
2   2   2
3   3   3
4   4   4
5   1   1
6   2   2
7   3   3
8   4   4
9   5   5
другие блоки

Другие блоки, f1_c14[$1,$2,$4] И f1[$1,$2,$4] только выполненный, когда значения от тех элементов массива имеет значение.

8
27.01.2020, 21:10
  • 1
    @namrata - Большой. Если Вы - проблема, был разрешен, может Вы отмечать это как принятый ответ так, чтобы другие знали, что это было решено. –  slm♦ 29.07.2013, 16:20
  • 2
    Сделанный!! Еще раз спасибо за Ваше быстрое решение. –  Namrata 29.07.2013, 17:07

Вот решение в Perl. Необходимо сохранить следующий код в файле и выполнить его как сценарий (см. ниже):

#!/usr/bin/perl
$file1 = '/path/to/file1';
$file2 = '/path/to/file2';
open $f1,'<',$file1;
open $f2,'<',$file2;
while(<$f1>){
    ($c1,$c2,$c4,$c5) = (split / /)[0,1,3,4]; #get relevant columns in file 1
    $lines_dictionary{"$c1 $c2 $c4"}="$c5---$_"; #create a hash entry keyed by the relevant columns
}
while(<$f2>){
    ($c1,$c2,$c4,$c5) = (split / /)[0,1,3,4]; #get relevant columns in file 2
    if(exists $lines_dictionary{"$c1 $c2 $c4"}){ #if a line with similar columns was seen in file 1
        ($file1_c5,$file1_line) = split /---/,$lines_dictionary{"$c1 $c2 $c4"}; #parse the hash entry this line in file 1
        if($file1_c5 -ne $c5){ #if column 5 of file 2 doesn't match column 5 of file 1
            print "${file1_line}$_\n"; #we only need one extra newline as the lines read from the files have trailing ones.
        }
    }
}
close $f1;
close $f2;

Используйте любой текстовый редактор, чтобы вставить этот сценарий в файл, изменить $file1 и $file2 переменные для отражения истинных местоположений файлов затем сделайте исполняемый файл сценария путем выполнения:

$ chmod +x /path/to/script

Наконец, назовите сценарий:

$ /path/to/script

Отказ от ответственности

  • Этот код не тестируется
  • Этот код предполагает, что шаблон '---' вряд ли произойдет в 5-м столбце.
  • Этот код предполагает, что строки в файле 1 уникальны (т.е. что каждая строка имеет различную комбинацию "column1 column2 column4"). Если будет несколько строк (не обязательно последовательны) содержащий те же данные в соответствующих столбцах, то сценарий будет использовать последний (самый нижний в файле) этих строк.
1
27.01.2020, 21:10
  • 1
    R для Вашего решения. Это очень помогло. –  Namrata 30.07.2013, 18:00
  • 2
    Пожалуйста. Вы на самом деле протестировали его? –  Joseph R. 30.07.2013, 18:35

Теги

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