Изменение разделителя csv-файлов в unix
У меня их несколько .csv файлы с разделителем табуляции, и теперь я хочу изменить разделитель. Когда я использую приведенный ниже скрипт, он не изменяет файл. Пожалуйста, помогите мне со сценарием.
file_mask=$1
from_delim=$2
to_delim=$3
for i in `ls $file_mask*`
do
sed -i 's|$from_delim|$to_delim|g' $i
done


Ответы - Изменение разделителя csv-файлов в unix / Change csv file delimiter in unix


09.10.2013 03:58:38
Вам нужно использовать двойные кавычки для тела sed, чтобы переменные оболочки могли быть расширены:
sed -i "s|$from_delim|$to_delim|g" $i
Лучше надеяться, что ни $from_delim, ни $to_delim не содержат трубы.
Кроме того, не разбирайте ls - вам вообще не нужен цикл for:
sed -i "s|$from_delim|$to_delim|g" ${file_mask}*
проверка различий:
file_mask=$1
from_delim=$2
to_delim=$3
sed -i.bak "s|$from_delim|$to_delim|g" $file_mask*
for f in $file_mask*; do
diff -q $f $f.bak >/dev/null
if (( $? != 1 )); then
echo "no changes made to $f"
fi
done


sed -i
, он будет редактировать каждый из них по очереди: sed сам по себе зацикливается на файлах.


sed
или tr
будет недостаточно. Вы должны иметь сбалансированные цитаты вы все еще можете использовать sed
, но это становится громоздким: unix.stackexchange.com/questions/48672 / ... лучше использовать csvtool напр.

11.01.2017 03:34:24
Не используйте sed
для этого sed или tr, используйте tr
(доступный из общих репозиториев). Если у вас есть вкладки в строках, то вышеописанные простые инструменты будут подавляться. Вам нужно будет использовать csvtool
, чтобы начать подсчет котировок и т. д. С этими основными инструментами будет полный бардак.
Заменить вкладки, например, полуколоннами с csvtool, включая все угловые случаи, просто.:
awk
С csvtool -t TAB -u ';' cat $ifile -o $ofile
входной файл и $ifile
выходной файл.

25.11.2019 06:22:15
Я рекомендую использовать csvkit: https://csvkit.readthedocs.io/en/latest/. с помощью csvformat, который поставляется вместе с пакетом, вы можете безопасно изменить разделитель.
csvformat -D '[your delimiter here]' [file name]