Как оптимизировать скрипт с помощью NF и цикла for

Наконец, после всех опробованных мною опций я удалил ос windows и mint os, которые давали только диск для загрузки ubuntu mate os, что в итоге решило проблему .

4
03.09.2017, 17:10
4 ответа

Использование GNUsed:

$ sed -e "s/^/('/" -e "s/\t/','/g" -e "s/$/'),/" -e '$s/.$/;/' file
('0001','000000000000001','john smith','45','500'),
('0002','000000000000002','peter jackson','20','80'),
('0003','000000000000002','robert brown','35','100'),
('0004','000000000000007','sarah white','40','300');

Скрипт sedсостоит из четырех частей:

  1. s/^/('/заменяет начало строки на ('.
  2. s/\t/','/gзаменяет вкладки на ','. Это то, что требует GNU sed. Для других реализаций sedвставьте символ табуляции вместо \t.
  3. s/$/'),/заменяет конец строки на '),.
  4. $s/.$/;/заменяет запятую в конце последней строки (только )на ;.
4
27.01.2020, 20:48

Если ваш входной файл разделен табуляцией, вы можете попробовать следующее:

awk -F"\t" -v q="'" -v OFS="','" '$1=$1 {print "(" q $0 q ");"}' filename

Или вставить кавычки в функцию печати:

awk -F"\t" -v OFS="','" '$1=$1 {print "(" "\x27" $0 "\x27" ");"}' filename
5
27.01.2020, 20:48

Чтобы добиться такого же поведения, как вы хотите, с вашим первоначальным скриптом, вы можете использовать метод "printf" awk. Это позволяет избавиться от символов новой строки, которые ставятся "печатью". Я предполагаю, что ваш скрипт должен быть переписан так:

cat test01 | awk '{for (i = 1; i <= NF; i++){printf $i"'\'','\''"}; printf "\n";}'
0
27.01.2020, 20:48

Вот моя попытка...

Мое утверждение состоит из 3-х частей :cat, awk, sed

Операторы awk и sed определенно можно улучшить, но я все еще изучаю их оба. Я сделал test01 в test2.txt

cat test2.txt | awk -F "\\t| " 'BEGIN {ORS=""}{print "("}{ORS=","}{for (i = 1; i <= NF; i++){print "'\''"$i"'\''"}}{print ")\n"}{ORS=""}' | sed 's/,)/),/' | sed 's/^,//' | sed '$ s/),/);/'
0
06.10.2021, 14:06

Теги

Похожие вопросы