При чтении из файла выберите определенные поля и сравните их с другим файлом в ударе Unix?

rc.local файл на Debian главным образом для совместимости с системами стиля non-init. Вы не должны использовать его.

Вместо этого рекомендуется скопировать /etc/init.d/Skeleton к новому init сценарию для того, что Вы хотите произойти при изменении runlevels, затем используйте inserv включить его.


Обновление: Согласно комментарию ниже, больше не рекомендуется этот ответ. Однако этот ответ был отправлен за несколько лет до скелетной депрекации, и тот скелет все еще существует в Debian, нестабильном по состоянию на январь 2019.

1
31.07.2013, 15:52
2 ответа

Принятие Вас хочет сравнить строки в file b к соответствующим строкам в file a (т.е. что оба файла имеют то же количество строк, и Вы выдерживаете сравнение линию за линией), можно использовать сценарий Perl, чтобы сделать это для Вас:

#!/usr/bin/perl
$file_a = "/path/to/file_a";
$file_b = "/path/to/file_b";
open $fa,'<',$file_a or die "Failed to open file $file_a: $!\n";
open $fb,'<',$file_b or die "Failed to open file $file_b: $!\n";
@file_a = <$fa>;
@file_b = <$fb>;
close $fa;
close $fb;
for (0..$#file_a){
    ($col_c,$col_d) = (split / /,$file_a[$_])[2,3];
    $col_z = $file_b[$_];
    $to_display = "$col_c $col_d";
    if($col_z eq $col_d){
        $to_display .= " $col_z";
    }
    else{
        $to_display .= " pin";
        if ($col_z gt $col_c and $col_z gt $col_d ){
            $to_display .= " lon";
        }
        elsif($col_z lt $col_c and $col_z lt $col_d) {
            $to_display .= " sma";
        }
    }
    print "$to_display\n";
}

Сохраните вышеупомянутый файл как /path/to/myscript (после того, как, изменяя местоположения file_a и file_b к Вашим истинным местоположениям), затем сделайте это исполняемым файлом: chmod +x /path/to/myscript и наконец вызовите его: $ /path/to/myscript.

1
27.01.2020, 23:39
  • 1
    ценит его, но я хочу использовать циклы вместо этого поэтому, если я могу найти способ получить только 2 поля файла некоторое время, читая его и затем сравнить одного из них к полю другого файла –  user2613272 31.07.2013, 14:38
  • 2
    @user2613272, Если я не неправильно понимаю Вас, это точно, что происходит в вышеупомянутом коде с for (0..$#file_a) цикл. –  Joseph R. 31.07.2013, 14:39
  • 3
    Весь код жемчуга должен иметь use strict, и это должно смочь скомпилировать с strict. –  jordanm 31.07.2013, 16:41
  • 4
    @jordanm Это очень спорно в лучшем случае В то время как я соглашаюсь с принципом в целом и использую его для всех своих сценариев, я не использую его для одноразового, специального кода. –  Joseph R. 31.07.2013, 16:54

Как я сказал в своем комментарии, я не совсем уверен, что Вы пытаетесь сделать, Вы, кажется, хотите всегда распечатать поля c и d и выдерживать сравнение только d с z. Если так, решение ниже должно работать.

$ paste a b | awk '{print $3,$4,$6}' | head -n 1; paste a b | tail -n +2 |
   while read a b c d e z; do 
    echo -n "$c $d"; 
    if [ "$d" -lt "$z" ]; then 
      echo "pin sma"; 
    elif [ "$d" -gt "$z" ]; then 
      echo "pin lon"; 
    else echo $z; 
    fi; 
   done 

Работайте на файлах в качестве примера, которые Вы обеспечили, это дает:

c d z
2 33
6 5pin lon
0 9pin lon

Объяснение

Так как Вы хотите арифметическое сравнение, заголовки повредят сценарий. Однако я предполагаю, что требуется иметь их в окончательном результате. Так, сначала я печатаю их:

paste a b | awk '{print $3,$4,$6}' | head -n 1;

Так, теперь мы хотим обработать остальную часть полей, пропуская заголовок. Так, мы paste файлы снова, пропустите заголовки (tail -n +2) и обработайте поля.

1
27.01.2020, 23:39
  • 1
    1.please, что у меня нет того же количества строк в обоих файлах. –  user2613272 01.08.2013, 10:00
  • 2
    2. второй у меня есть файлы, но я не знаю, как присвоить определенные поля в переменные и затем использовать эти переменные. В основном в конце, что я хочу, да для печати cd_z –  user2613272 01.08.2013, 10:03
  • 3
    , которым каждая строка в d должна быть по сравнению с каждой строкой в z –  user2613272 01.08.2013, 10:06
  • 4
    я не хочу использовать жемчуг, я пишу в ударе и спасибо –  user2613272 01.08.2013, 10:11
  • 5
    и на основе Вашего кода, как это знает, где получить переменные от который файлы? –  user2613272 01.08.2013, 10:15

Теги

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