1

У меня проблема с одним сегментом следующего скрипта. Каждый echo-> grep-> был написан, чтобы помочь мне понять, где скрипт не работал, как я ожидаю. Он предназначен для того, чтобы быть частью большей петли, но для здравомыслия у меня есть только та часть, которая имеет отношение к моему вопросу.

У меня есть файлы в /var/www/acpog/upload с именем 0SCAN2013 за которым следует остальная часть даты (ГГГГММДДЧЧммСС)

И файл ./alt_upcs.csv имеет 2 столбца, один из которых sku (1419), второй - UPC (9781844484201)

Если я не могу найти соответствие в /var/www/acpog/uploads/ для sku, я хочу попытаться найти соответствие для UPC. Если это не удается, я хочу попытаться найти совпадение для sku с нулями с левой стороны.

Вот фрагмент:

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

и вот вывод:

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

Строки 1, 2, 3 и 5 соответствуют ожиданиям. В строке 4 нет начала строки, которую я пытаюсь повторить непосредственно перед запятой. Если после этого я выведу переменную $j , она, как и ожидалось, содержит UPC, но команда grep, использующая эту переменную, тоже ничего не возвращает.

РЕДАКТИРОВАТЬ: Кроме того, есть 4 файла, которые должны соответствовать в каталоге загрузки, все начиная с 0SCAN2013

Вот еще один вывод из запускаемых вручную команд из приглашения:

# 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

Чтобы проверить, эти файлы должны работать. В каталоге, где находится скрипт: имя файла alt_upcs.csv содержащее 1 строку:

1419,9781844484201

В /var/www/acpog/upload/ имя файла 0SCAN20130821213905 содержит 1 строку:

9781844484201,0,2,8:21,13:48:496

1 ответ1

0

Ваш CSV-файл имеет окончания строки "CRLF" окна. (CR - это "возврат каретки", также пишется \r или \0x0D ; LF - "перевод строки", \n или \0x0A). Используемые вами утилиты Unix не распознают CR как часть окончания строки, поэтому она становится частью искомого UPC. Это предотвратит обнаружение UPC. Это также создает вводящий в заблуждение вывод (ваша строка 4), потому что CR выполняет возврат каретки на выходе, заставляя часть эха, следующего за ним (начиная с " ,"), перезаписывать начало.

Используйте dos2unix или аналогичную утилиту, чтобы исправить ваш CSV-файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .