Замените файл с разделителями-запятыми вертикальной чертой, но не удаляйте запятую, кавычки и т. Д. В поле текстового квалификатора, однако удалите текстовый квалификатор!

Гордон правильно описал проблемы с вашим кодом в своем ответе. Я даю вам альтернативную версию вашего кода, как я бы написал ее:

echo 'First file'

for (( i = 20; i < 100; i += 20 )); do
    printf '[%d-%d]\n' "$(( i + 1 ))" "$(( i + 20 ))"
done

Использование printf, как правило, безопаснее для вывода пользовательских или переменных данных. См., например. Почему printf лучше, чем echo?

Поскольку интервалы являются регулярными, цикл for в стиле C, возможно, лучше подходит, чем явное перечисление начального номера каждого интервала.

0
17.11.2018, 11:48
2 ответа
ESC=$(printf '\033')
RED="${ESC}[0;31m"
 NC="${ESC}[0m"

sed -e '
   /./!b
   /[^[:space:]]/!b

   s/.*/\
&,/

   :loop
      h
      s/\(\n\),/|\1/;                                                  # An empty field
      s/\(\n\)\([+-]\{0,1\}[.][0-9]\{1,\}\),/\2|\1/;                   # +-.NNN
      s/\(\n\)\([+-]\{0,1\}[0-9]\{1,\}\([.][0-9]*\)\{0,1\}\),/\2|\1/;  # +-NNN.MMM +-NNN. +-NNN
      s/\(\n\)~\([0-9][0-9]*\),/\2|\1/;                                # ~NNN
      s/\(\n\)\([0-9][0-9]*\)~,/\2|\1/;                                # NNN~
      s/\(\n\)~\([^~]*\)~,/\2|\1/;                                     # ~...~
      x;G
      /^\(.*\)\n\1$/{
         g;'"s/\n\([^,]*\)/${RED}\1${NC}/"'
         i\
***'"${RED}ERROR${NC}"'*** Unable to process the field shown colored.\
\
Cause of error: What this means is that this particular field is not \
\
           Fix: You should add to the sed code in the :loop label to \
                digest the able to be processed by the sed code as it stands.\
\
The record with the offending field shown colored red:\

         q
      }
      g; # all clear: recover and carry on...
   /\n$/!bloop

   s/..$//
' csv.data

Работа

  • Мы основываем решение на различных типах полей.
  • Пропуск пустых или пустых строк.
  • Добавьте "," для упрощения использования регулярного выражения, мы уберем его в конце.
  • Чтобы запустить игру, поместите маркер \n в начало строки. Этот маркер будет перемещаться слева направо, перескакивая через обрабатываемое поле за раз.
  • Действие начинается в цикле do-while, в теле которого мы обрабатываем поле за раз. Начало поля сигнализируется \n, и мы обрабатываем различные разновидности полей, которые могут возникнуть. Каждый раз мы переносим обрабатываемое поле слева от \n и заменяем , на |.
  • Цикл останавливается, когда маркер \n достигает конца строки /\n$/, после чего мы удаляем маркер и пустышку , мы разместили в начале.

Результаты

364034|2015652205|26722|2015|4|C25753-4|TC25753,|2WD Double Cab 144.2" SLT,|Y|40506.16|43555.00|1095.00|043|005|006|007|003|008|016|041|012|029|068|027|028|033|3|2WD Double Cab 144.2"|SLT|6|4|N|S|N|S|N|N|N|| |Confirmed|w2015k65m22t5|Sierra 2500HD|Double Cab Standard Box 2-Wheel Drive SLT|Rear Wheel Drive|Extended Cab Pickup - Standard Bed
2
28.01.2020, 02:25

Я бы предложил использовать специальный анализатор CSV, такой как perl's Text::CSV

perl -MText::CSV -lne '
    BEGIN{ $csv = Text::CSV->new({ quote_char => "~" , escape_char => "~" , allow_whitespace => 1}) } 
    print join "|", $csv->fields() if $csv->parse($_)
  ' file_name
364034|2015652205|26722|2015|4|C25753-4|TC25753,|2WD Double Cab 144.2" SLT,|Y|40506.16|43555.00|1095.00|043,005,006,007,003,008,016,041,012,029,068,027,028,033|3|2WD Double Cab 144.2"|SLT|6|4|N|S|N|S|N|N|N|| |Confirmed|w2015k65m22t5|Sierra 2500HD|Double Cab Standard Box 2-Wheel Drive SLT|Rear Wheel Drive|Extended Cab Pickup - Standard Bed
1
28.01.2020, 02:25

Теги

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