awk + сортировка файла по значениям в файле и запись двух разных файлов - PullRequest
0 голосов
/ 16 июня 2010

у меня в файле file_test значения для правого и левого глаза Как разделить file_test на file1 и file2 с помощью awk, чтобы записать равные значения в file1 и различные значения в file2, как показано в следующем примере

file_test - это:

NAME: jim 
LAST NAME: bakker
right eye: >|5|< 
left eye VALUE: >|5|< 
NAME: Jorg 
LAST NAME: mitchel
right eye: >|3|< 
left eye VALUE: >|5|< 
NAME: jimmy  
LAST NAME: kartter
right eye: >|6|< 
left eye VALUE: >|5|< 
NAME: david  
LAST NAME: kann
right eye: >|9|< 
left eye VALUE: >|9|< 

file1 должно быть:

NAME: jim  
LAST NAME: bakker
right eye: >|5|< 
left eye VALUE: >|5|< 
NAME: david  
LAST NAME: kann
right eye: >|9|< 
left eye VALUE: >|9|< 

file2 должно быть:

NAME: Jorg  
LAST NAME: mitchel
right eye: >|3|< 
left eye VALUE: >|5|< 
NAME: jimmy  
LAST NAME: kartter
right eye: >|6|< 
left eye VALUE: >|5|<

Ответы [ 2 ]

1 голос
/ 16 июня 2010
awk -F: '/^NAME:/ && buff {
  say(buff, eyes); buff = null 
  split(null, eyes) # use delete eyes if supported
  }
{ 
  buff = buff ? buff RS $0 : $0
  /eye/ && eyes[$NF]
  }
END { say(buff, eyes) }
func say(b, e) {
  # length(array) is not portable
  print b > (length(e) > 1 ? "file2" : "file1")
  }' file_test
0 голосов
/ 16 июня 2010

Я бы использовал Perl для этого:

    open my $f, "<", "file_input";
    open my $file1, ">", "file1";
    open my $file2, ">", "file2";
    while (! eof($f)) {
        my $person; $person .= <$f> for (1..4);  # read 4 lines
        my ($right) = ($person =~ /^right.*?(\d+)/m);
        my ($left) = ($person =~ /^left.*?(\d+)/m);
        my $file = ($right == $left) ? $file1 : $file2;
        print $file $person;
    }
    close $f;
    close $file1;
    close $file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...