Bash - построил файл CSV из TXT - PullRequest
0 голосов
/ 18 октября 2018

Я новичок в использовании bash и grep ... Я пытаюсь вывести файл CSV из файла TXT, который содержит следующие строки:

Ввод:

1. Fisrt - Name: Joanna Last - Name: Yang
Place of birth: Paris Date of birth: 01/01/1972 Sex: F
Number: 0009876541234567
2. Fisrt - Name: Bob Last - Name: Lee
Place of birth: London Date of birth: 05/08/1969 Sex: M
Number: 0005671890765223

Вывод:

"Joanna","Yang","Paris","01/01/1972","F","0009876541234567"
"Bob","Lee","London","05/08/1969","M","0005671890765223"

Будем благодарны за любые предложения !!!!

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Если ваш файл хорошо отформатирован, регулярное выражение не требуется.
Мы можем читать три строки за раз и разбивать их на пробелы - нас интересуют только указанные поля.Если вы можете «утверждать», что ни в одном из полей файла не будет пробелов (я думаю, что ни одно действительное человеческое имя не содержит пробелов… правильно?), Вы можете просто сделать это:

while
    IFS=' ' read -r _ _ _ _ name _ _ _ last &&
    IFS=' ' read -r _ _ _ birthplace _ _ _ birthdate _ sex &&
    IFS=' ' read -r _ number
do
    printf '"%s","%s","%s","%s","%s","%s"\n' \
        "$name" "$last" "$birthplace" "$birthdate" "$sex" "$number"
done <input

Живая версиядоступный в onlinedbg .

0 голосов
/ 18 октября 2018

В одной строке:

~ $ cat yourfile.txt 
1. Fisrt - Name: Joanna Last - Name: Yang
Place of birth: Paris Date of birth: 01/01/1972 Sex: F
Number: 0009876541234567
2. Fisrt - Name: Bob Last - Name: Lee
Place of birth: London Date of birth: 05/08/1969 Sex: M
Number: 0005671890765223
~ $ sed -r "s/^.*Fisrt - Name: (.*) Last - Name: (.*)$/\1,\2;/g" yourfile.txt | sed -r "s/^Place of birth: (.*) Date of birth: (.*) Sex: (.*)$/\1,\2,\3;/g" | sed -r "s/^Number: (.*)$/\1/g" | sed -n 'H;${x;s/;\n/,/g;s/^,//;p;}' | tail -n +2 > yourfile.csv
~ $ cat yourfile.csv 
Joanna,Yang,Paris,01/01/1972,F,0009876541234567
Bob,Lee,London,05/08/1969,M,0005671890765223
~ $ 

Надеюсь, это поможет.

0 голосов
/ 18 октября 2018

Использовать только одно регулярное выражение с grep будет нелегко.
Вы можете попробовать использовать несколько регулярных выражений и объединить результаты.

Например:
Чтобы получить имена вы можете использовать это регулярное выражение: "Fisrt - Name: ([a-zA-Z]+)".
Сохранить это в переменную.

Далее, чтобы получить даты рождения вы можете использовать "birth: ([0-9]+\/[0-9]+\/+[0-9]+)".
Сохранитьэто в переменную.

Сделайте это для каждой части и объедините результаты с комой.

Это явно не лучший способ, но это начало.Чтобы помочь с регулярным выражением, вы можете использовать https://regex101.com/.

Возможно, попробуйте использовать командную строку sed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...