DATE,ITEM
2017-11-06 ,01001
2017-11-06 ,01005
2017-11-06 ,01013
--- Я использую с этим скриптом----
#!/bin/bash
IFS=,
while read DATE ITEM
do
echo "INSERT INTO DB (DATE, item) VALUES ('$DATE', '$item');"
DATE,ITEM
2017-11-06 ,01001
2017-11-06 ,01005
2017-11-06 ,01013
--- Я использую с этим скриптом----
#!/bin/bash
IFS=,
while read DATE ITEM
do
echo "INSERT INTO DB (DATE, item) VALUES ('$DATE', '$item');"
Используйте awk
для очистки ввода, а затем передайте значения с нулевым разделителем в while-loop
, как показано ниже:
# cat 47153204.txt #note that I have added extra spaces/commas to make things more difficult
DATE,ITEM
2017-11-06,01001
2017-11-06, 01005
2017-11-06, 01013
# awk -F '[ ,]+' 'NR>1{printf "%s\0%s\0",$1,$2}' 47153204.txt |
while IFS= read -r -d '' date time
do
# Use the date & time values to construct the query.
done
Следующая команда сначала отформатирует ваш входной файл и заменит «,» вкладками, чтобы awk мог правильно его обработать.
Затем awk начнет обрабатывать вывод из второй строки, а затем создаст ваши запросы на вставку.
sed 's/ ,/\t/g' test.txt | awk '{if(NR>=2) print "INSERT INTO DB (DATE, item) VALUES(\x27"$1"\x27, \x27"$2"\x27);";}' > my_insert_queries.out
Вы также можете определить другой разделитель полей для awk:
В командной строке awk FS можно указать как
-F <sep> (or -v FS=<sep>)
вместо использования sed для увеличения скорости обработки.
awk -F' ,' '{if(NR>=2) print "INSERT INTO DB (DATE, item) VALUES(\x27"$1"\x27, \x27"$2"\x27);";}' test.txt > my_insert_queries.out
sed
нет ничего, чего нельзя было бы сделать с помощью awk
здесь. Конвейер вывода sed
в awk
является излишним, и его можно избежать.
- person sjsam; 07.11.2017
sed -n '2,$s/\(.*\),\(.*\)/'"INSERT INTO DB(DATE, item) VALUES('\\1','\\2')/p" | sql
- person tripleee; 07.11.2017