Извините, люди, которых я новичок в Linux, и пока я просматривал список ответов на вопросы, я не знаю достаточно, чтобы узнать, был ли ответ на мой вопрос. Или, если я смогу адаптировать один из ответов на мою небольшую проблему.
Я получаю текстовый файл данных от моего босса, который научился использовать компьютеры в одну сторону; и он не изменится. Данные - это почти csv-файл, за исключением того, что все поля разделены пробелами, а не запятой или символом табуляции. И текстовые поля данных также включают в себя встроенные пространства.
Каждое поле является либо числом, либо числом и текстом, все поля имеют разную длину, и ни одна из них не установлена с одинарными или двойными кавычками. Поля чисел преобладают, и никакое текстовое поле не смежно с любым другим текстовым полем. Редко представляет собой внедренное число в текстовое поле, которому предшествует символ пробела или сопровождается символом [пробел].
К сожалению, не каждый символ [пробел] можно просто заменить. Вместо этого, потому что, как правило, разрывы полей имеют форму либо [пробел] [0-9], либо [0-9] [пробел], так я определяю, следует ли преобразовать символ [пробел] в [tab] характер или нет. Если символ [пробел] находится рядом с цифрой, его нужно преобразовать в символ [tab].
Таким образом, используя функцию «Найти / заменить» в «Блокноте для Windows», я ищу пробел или пробел -digit, преобразуя этот символ [пробел] в символ [tab]. Я должен сделать это десять раз [0-9] [пробел], а затем еще десять раз [пробел] [0-9]. Я ищу сценарий, чтобы сделать это автоматически.
Вот пример файла, который я получаю. Он содержит четыре поля, разделенных символами [пробел] (первая строка). Каждая следующая строка - одна запись, поэтому вторая строка - первая запись. Account - 2281, Units - 19, Description - Toshiba PX-1982GRSUB {, и, наконец, поле Delta содержит 0:
Account Units Description Delta
2281 19 Toshiba PX-1982GRSUB 0
9618 200 HP MX19942-228b -25
19246 4 CompuCom HD300g Hard Drive 4
Итак, что Я ищу сценарий, который будет читать исходный файл, преобразовать символы [пробел], которые являются разделителями полей, в символы и записать все это в новый файл. И я хочу объяснение, поэтому я не буду снова и снова задавать одни и те же вопросы.
Хорошо, поэтому вам нужно заменить первые два и последнее место в каждой строке запятой. Вы не можете просто заменить каждое пространство, потому что 3-е поле может содержать пробелы. Вы можете сделать это с заменой регулярных выражений. Вот сценарий / команда sed, которая работает:
sed -re 's/^(\S*) (\S*) (.*) (\S+)\s*$/\1,\2,\3,\4/' in.txt > out.csv
В приведенном выше примере это возвращает:
Account,Units,Description,Delta
2281,19,Toshiba PX-1982GRSUB,0
9618,200,HP MX19942-228b,-25
19246,4,CompuCom HD300g Hard Drive,4
Это все еще довольно хрупко с обработкой пустых полей и разрывов полностью, если столбцы, отличные от третьего, содержат пробелы. Очень легко ввести такие искаженные данные, если они отформатированы вручную, как это сделал ваш босс. Вы должны предложить ему перейти на более надежный формат таблицы (например, правильный CSV & amp; Co) и редактор (общие инструменты распространения листа могут работать с CSV довольно хорошо и гибко, например LibreOffice / OpenOffice Calc, Microsoft Excel и Google Docs).