como canalizar a saída de corte para o comando foreach?

2

Eu tenho o comando cut que quero que pegue a primeira palavra em cada linha de um arquivo. Eu então quero colocar cada palavra do comando cut em um foreach. Eu então quero fazer um comando grep dentro do corpo do foreach para buscar aquela palavra em outro arquivo.

Algo parecido com isto:

@array = (cut /tmp/10218.after -f1); 
foreach $word (@lines) { 
   grep $word /tmp/10218.before;
} 

Obviamente, a atribuição @array não funciona. Como posso contornar isso?

Tenho certeza de que existem muitas maneiras de não saber quais são ou quais são as melhores ou boas o suficiente.

    
por Ramy 15.04.2014 / 22:15

3 respostas

4

No bash

while read -r word
do
    grep -q "$word" file.before
    if [ $? -ne "0" ]
    then
        echo "$word not in file"
     fi
done < <(cut -f1 -d" " file.after)

O -q to grep diz para ficar quieto, você pode então interrogar $? para ver se houve uma coincidência 0 ou não 1 .

    
por 15.04.2014 / 22:51
3

Você vai querer fazer algo mais assim:

for i in $(cat /tmp/10218.after)
do
    grep $(echo ${i} | cut -f1) /tmp/10218.before
done

Se você quiser ficar um pouco mais chique e produzir algo se o grep falhar, faça algo como:

for i in $(cat /tmp/10218.after)
do
    COUNT=grep -c $(echo ${i} | cut -f1) /tmp/10218.before
    if [[ ${COUNT} -eq 0 ]]
    then
        echo "${i}: Not Found"
    else
        echo "${i}: Found"
    fi
done
    
por 15.04.2014 / 22:23
1

Use perl.

#!/usr/bin/perl

use strict;
use warnings;

my %words_to_find;

open ( my $input, "<", "/tmp/10218.after" );
while ( my $line = <$input> )
{
  my ( $word ) = ( $line =~ m/\A(\S+)\s/ );
  $words_to_find{$word}++;
}
close ( $input );

open ( my $search, "<", "/tmp/10218.before" ); 
while ( my $line = <$search> )
{
  foreach my $word ( key %words_to_find )
  { 
    if ( $line =~ m/$word/ )
    {
      print $line;
      last;
    }
  }
}
close ( $search );

Algo como isso deve fazer o truque.

    
por 15.04.2014 / 22:23