Tendo problemas com o que deveria ser um simples script bash

1

Estou tendo um problema com um segmento do script a seguir. Cada echo- > grep- > foi escrito para me ajudar a descobrir onde o script estava falhando como eu esperava. Ele é projetado para fazer parte de um loop maior, mas para sanidade, eu tenho aqui apenas a parte que é relevante para a minha pergunta.

Eu tenho arquivos em /var/www/acpog/upload que são nomeados 0SCAN2013 seguidos pelo restante da data (YYYYMMDDHHmmSS)

E o arquivo ./alt_upcs.csv tem 2 colunas, sendo uma delas sku (1419), a segunda sendo UPC (9781844484201)

Se eu não conseguir encontrar uma correspondência no /var/www/acpog/uploads/ do sku, quero tentar encontrar uma correspondência para o UPC. Se isso falhar, quero tentar encontrar uma correspondência para o sku com zeros preenchendo o lado esquerdo.

Este é o snippet:

st="0"
id="1419"
sd="SCAN2013"

echo "grep \"^$id,\" /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1"
grep "^$id," /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1
dt=$(grep "^$id," /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1)

if [ "$dt" == "" ]
then
  echo "grep \"^$id,\" alt_upcs.csv | cut -d',' -f 2"
  grep "^$id," alt_upcs.csv | cut -d',' -f 2
  u=$(grep "^$id," alt_upcs.csv | cut -d',' -f 2)
  for j in $(grep "^$id," alt_upcs.csv | cut -d',' -f 2)
  do
    if [ "$dt" == "" ]
    then
      echo "grep \"^$j,\" /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1"
      grep "$j" /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1
      dt=$(grep $j /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1)
    fi
  done
fi

if [ "$dt" == "" ]
then
  echo "grep \"^0$id,\" /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1"
  grep "^0$id," /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1
  dt=$(grep "^0$id," /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1)
fi

e aqui está a saída:

grep "^1419," /var/www/acpog/upload/0SCAN2013* | cut -d',' -f 4-5 | tail -1
grep "^1419," alt_upcs.csv | cut -d',' -f 2
9781844484201
," /var/www/acpog/upload/0SCAN2013* | cut -d',' -f 4-5 | tail -1
grep "^01419," /var/www/acpog/upload/0SCAN2013* | cut -d',' -f 4-5 | tail -1

As linhas 1, 2, 3 e 5 são as esperadas. A linha 4 não tem o começo da linha que estou tentando fazer até logo antes da vírgula. Se eu fizer eco da variável $j depois disso, ela contém o UPC como esperado, mas o comando grep usando essa variável também não está retornando nada.

EDIT: Além disso, existem 4 arquivos que devem coincidir no diretório de upload, todos começando com 0SCAN2013

Aqui estão alguns resultados adicionais da execução manual de comandos a partir do prompt:

# echo "grep \"^$j,\" /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1"
grep "^9781844484201," /var/www/acpog/upload/0SCAN2013* | cut -d',' -f 4-5 | tail -1

# grep $j /var/www/acpog/upload/$st$sd*
/var/www/acpog/upload/0SCAN20130821213905:9781844484201,0,2,8:21,13:48:496

# grep $j /var/www/acpog/upload/$st$sd* | cut -d',' -f 1 | tail -1
/var/www/acpog/upload/4SCAN20130805204626:9781844484201

# grep $j /var/www/acpog/upload/$st$sd* | cut -d',' -f 2 | tail -1
2

# grep $j /var/www/acpog/upload/$st$sd* | cut -d',' -f 3 | tail -1
-1

# grep $j /var/www/acpog/upload/$st$sd* | cut -d',' -f 4-5 | tail -1
8:21,13:48:496

Para testar, esses arquivos devem funcionar. No diretório em que o script reside: nome do arquivo alt_upcs.csv contendo 1 linha:

1419,9781844484201

No diretório /var/www/acpog/upload/ , nome do arquivo 0SCAN20130821213905 contining 1 line:

9781844484201,0,2,8:21,13:48:496
    
por David Wilkins 02.09.2013 / 18:33

1 resposta

0

Seu arquivo csv tem janelas "CRLF" finais de linha. (CR é "retorno de carro", também escrito \r ou \nx0D ; LF é "feed de linha", ,"x0A ou %code% ). Os utilitários unix que você está usando não reconhecem o CR como parte do fim da linha, então ele se torna parte do UPC pesquisado. Isso impedirá que o UPC seja encontrado. Ele também cria saída enganosa (sua linha 4), porque o CR faz um retorno de carro na saída, fazendo com que a parte do eco que o segue (começando com %code% ) sobrescreva o início.

Use o dos2unix ou algum utilitário semelhante para corrigir seu arquivo csv.

    
por 02.09.2013 / 19:43