Bash - построил файл CSV из TXT
Я новичок в использовании 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 ответа
Использование только одного регулярного выражения с grep не будет легким.
Вы можете попробовать с несколькими регулярными выражениями и объединить результаты.
Например:
Чтобы получить первые имена, вы можете использовать это регулярное выражение: "Fisrt - Name: ([a-zA-Z]+)"
,
Сохраните это в переменную.
Далее, чтобы получить даты рождения вы можете использовать "birth: ([0-9]+\/[0-9]+\/+[0-9]+)"
,
Сохраните это в переменную.
Сделайте это для каждой части и объедините результаты с комой.
Это явно не лучший способ, но это начало. Чтобы помочь с регулярным выражением, вы можете использовать https://regex101.com/.
Может быть, попробуйте использовать командную строку Sed
Если ваш файл хорошо отформатирован, регулярное выражение не требуется.
Мы можем читать три строки за раз и разбивать их на пробелы - нас интересуют только указанные поля. Если вы можете "утверждать", что ни у одного поля из файла не будет пробелов (я думаю, что ни одно действительное человеческое имя не имеет пробелов в этом... правильно?), Вы можете просто сделать это:
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.
В одной строке:
~ $ 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
~ $
Надеюсь, поможет.