Paralelo GNU: Evento não encontrado (! ~)

3

Sobre o meu código:

  1. obtenha todos os arquivos .txt
  2. para cada arquivo, execute o comando awk. Todos os arquivos são processados em paralelo
  3. se a coluna 3 NÃO contiver "agulha", escrever linha para arquivo

Resultado:

-bash:! ~: evento não encontrado

Código:

ls *.txt | parallel "awk -F '\t' -v OFS='\t' '$1 { if($3 !~ /needle/){print;} ;}' {} > {}.output"

Pergunta:

  • O que estou fazendo de errado?

Obrigado

    
por fire_water 30.03.2015 / 21:31

2 respostas

2

Isso parece um problema de citação. Talvez a maneira mais fácil de depurar isso seja passar a opção --dry-run para paralelo:

$ parallel --dry-run "awk -F '\t' -v OFS='\t' '$1 { if($3 !~ /needle/){print;} ;}' {} > {}.output" ::: in
awk -F '\t' -v OFS='\t' ' { if( ~ /needle/){print;} ;}' in > in.output

Lá você pode ver que suas variáveis $1 e $3 desapareceram e que !~ foi expandido para ~ (no meu caso). Todos aqueles que têm um significado especial para o shell bash, e devem ser protegidos se forem para o awk. Em vez disso, tente o seguinte (eu também alterei o script awk para ajustar sua descrição):

parallel awk -F '\t' -vOFS='\t' $'\'($3 !~ /needle/) { print }\'' \>{}.output {} ::: *.txt

A razão pela qual essas expansões ocorreram é que os tokens estavam entre aspas duplas (eles estão entre aspas simples entre aspas duplas, mas o shell apenas se preocupa com as aspas externas).

Note que eu também evito analisar a saída de ls .

    
por 30.03.2015 / 21:37
0

Quando a citação fica muito difícil, considere o uso de funções bash:

myfunc() {
  awk -F '\t' -v OFS='\t' '$1 { if($3 !~ /needle/){print;} ;}' "$1" > "$1".output
}
export -f myfunc

parallel myfunc {} ::: *.txt
    
por 31.03.2015 / 01:28

Tags