Преобразуйте содержимое файла в заданный c вывод в bash - PullRequest
0 голосов
/ 01 марта 2020

Я новичок в bash сценариях, и я пытаюсь преобразовать файл, который:

  • CSV
  • Имеет случайные скачки строк, которые нарушают формат ( неверные данные от пользователя в CSV)

Результатом должен быть обработанный файл, который правильно разделяет строки (строки из набора элементов / столбцов), удаляя случайные переходы.

Мой первый подход состоял в том, чтобы удалить все скачки строки, используя

variable=$(cat $1)
tr -d "\n" $variable > $variable

, а затем, читая char по char, ища ',' со счетчиком, и добавляя скачок строки после каждого установленного числа из них были найдены. При попытке сделать это, я нашел информацию на while IFS= read и попробовал следующее:

while IFS=, read -r col1 col2 col3 col4 <<< $variable; do

    echo "$col1" "$col2" "$col3" "$col4" '\n'

done

Я явно чего-то там упускаю (я даже считаю, что пока l oop Я должен уже убрать скачки строки, пожалуйста, исправьте меня об этом), и я не уверен, как продолжать делать это. Я не ищу кучу кода, который делает эту работу, но пытаюсь найти кого-то, кто мог бы указать мне правильное направление (возможно, я не понимаю IFS, или мне нужно что-то обработать до этого шага ... что бы это ни было).

Заранее спасибо.

edit: я удалил переход строки, который я добавил в эхо, и теперь он печатает col1 col2 col3 col4 и никогда не заканчивается, поэтому я очевидно, что перед печатью невозможно связать каждый элемент из файла с переменными.

1 Ответ

1 голос
/ 01 марта 2020

вместо echo "$col1" "$col2" "$col3" "$col4" '\n'

просто напишите это

 echo -e "$col1 $col2 $col3 $col4 \n"

На самом деле проблема не в shell, а в самой команде echo и отсутствии двойной кавычки вокруг переменной интерполяции. Вы можете попробовать использовать echo -e, но это не поддерживается на всех платформах, и одна из причин, по которой printf теперь рекомендуется для переносимости.

Вы также можете попробовать вставить новую строку непосредственно в скрипт оболочки (если сценарий - это то, что вы пишете), так это выглядит ...

#!/bin/sh
echo "this is for
test"
#EOF

или, что эквивалентно,

#!/bin/sh
string="this is for
test"
echo "$string"  
# note double quotes!

удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...