Невозможно редактировать и записывать информацию в новый файл с помощью Awk и Sed - PullRequest
0 голосов
/ 16 февраля 2020

Как часть моей домашней работы, мне нужно взять строку, содержащую адресную информацию из текстового файла.

Как это.

2 GO MOBILITY / CALEX EXPRESS^58 PITTSTON AVENUE^^PITTSTON^PA^18640^570-603-1042

Затем отформатировать файл, чтобы он выглядел следующим образом.

Company Name: 2 GO MOBILITY / CALEX EXPRESS
Company Phone Number: 570-603-1042
Company Address: 58 PITTSTON AVENUE, PITTSTON, PA, 18640
\n (blank line)

Затем добавьте адрес в файл с именем PA_595.txt в каталоге ./basefolder/PA.

Если в списке указано другое состояние, информация должна появиться в файле в соответствующем файле. папки.

Мне нужно использовать AWK и SED для этого.

awk -v FS=^ '{print $1,$2,$3,$4,$5,$6,$7}' "./data/595.txt" | sed i\ " Company Name: $1 \n Company Address: $2,$3,$4,$5 \n Company Phone Number: $6" | tee "./$2/$5/${5}_595.txt"

Я получаю

PERFORMANCE MOBILITY 1640 WEST 7th AVE  EUGENE OR 97402 541-393-8474
Company Name:
Company Addess: ,,,
Company Phone Number:

Мне нужно

Company Name:PERFORMANCE MOBILITY
Company Phone Number:541-393-8474
Company Address: 1640 WEST 7th AVE, EUGENE, OR, 97402

Часть кода на awk работает. Я почти уверен, что проблема в том, что sed не видит названия полей из awk.

Я добился прогресса с прошлой ночи. Я изменил свой код на.

file_name=$1
i=0

while IFS=^ read company_name address1 address2 city state zip phone
do
    ((i++))

echo "./$2/$state/${state}_595.txt"

sed -e "i\ Company Name:$company_name \n Company Phone Number:$phone \n Company Addess: $address1, $city, $state, $zip \n " | tee "./$2/$state/${state}_595.txt"


done < $file_name

Проблема в том, что он показывает каждый адрес, как он показывает в текстовом файле. Но тогда он показывает это должным образом.

> ЭФФЕКТИВНОСТЬ МОБИЛЬНОСТИ ^ 1640 ЗАПАД 7-й АВЕ ^^ EUGENE ^ ИЛИ ^ 97402 ^ 541-393-8474 Название компании: 2 GO MOBILITY / CALEX EXPRESS Телефон компании Номер: 570-603-1042 Адрес компании: 58 ​​PITTSTON AVENUE, PITTSTON, PA, 18640

Однако форматирование неверно в текстовом файле и все адреса go в одном и том же текстовом файле.

Название компании: 2 GO MOBILITY / CALEX EXPRESS Номер телефона компании: 570-603-1042

Адрес компании: 58 ​​PITTSTON AVENUE, PITTSTON, PA, 18640

A & J MOBILITY ^ 3058 HELSAN DR ^^ RICHFIELD ^ WI ^ 53716 ^ 262-623-6236 Название компании: 2 GO MOBILITY / CALEX EXPRESS Номер телефона компании: 570-603-1042

Фирма Аддесс: 58 PITTSTON AVENUE, PITTSTON, PA, 18640

A to Z МОБИЛЬНОСТЬ И МЕДИЦИНСКОЕ ОБОРУДОВАНИЕ, В C. ^ PO BOX 99 ^^ SOMONAUK ^ IL ^ 60552 ^ 815-495 -3423 Название компании: 2 GO MOBILITY / CALEX EXPRESS Номер телефона компании: 570-603-1042

Я не уверен, почему.

L Аст-ответ получил меня почти до конца. Я только что увидел одну ошибку.

> tee: /CA_595.txt: В доступе отказано

Я проверил разрешения для папки и файла, и все они 775.

Я использую эту команду при создании файла .txt

cstates=($(awk -v FS=^ '{print $5}' "$1"))

for i in "${cstates[@]}"
do

    :

if [[ ! -f "./$2/$i/${i}_595.txt" ]]; then

    echo "Making ${i}_595.txt File"
    touch "./$2/$i/${i}_595.txt"
    chmod a+x "./$2/$i/${i}_595.txt"
    else echo "File ${i}_595.txt already exists"


fi
done

Или, если я просто использую эту команду.

file_name="$1"

while IFS=^ read -r company_name address1 address2 city state zip phone
do

# sed " a\ Company Name:$company_name \n Company Phone Number:$phone \n Company Addess: $address1, $city, $state, $zip \n " | tee -a "./$2/$state/${state}_595.txt"

printf "Company Name: %s\nCompany Address: %s%s, %s, %s, %s\nCompany Phone Number: %s\n\n" \
      "${company_name}" "${address1}" "${address2}" "${city}" "${state}" "${zip}" "${phone}" | tee -a "${outputdir}/${state}_595.txt" > /dev/null


done < $file_name

Разрешение для файла и папки выглядит нормально, и оно показывает я как владелец файлов и папок.

1 Ответ

0 голосов
/ 17 февраля 2020

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

   awk -v FS=^ '{
      printf ("Company Name: %s\nCompany Address: %s%s, %s, %s, %s\nCompany Phone Number: %s\n\n",
        $1,$2,$3,$4,$5,$6,$7)
      }' "./data/595.txt"

Если вы хотите отправить детали в разные каталоги, вы должны распечатать их внутри awk в файл и стандартный вывод. Ищите места во имя режиссера.

Использование al oop также возможно. Вы можете использовать tee -a (a = append) внутри l oop.

file_name="$1" # Quote, look out for spaces.
i=0
# use read with option -r
while IFS=^ read -r company_name address1 address2 city state zip phone
do
   # Not used: ((i++))
   outputdir="./$2/$state"
   mkdir -p "${outputdir}"
   printf "Company Name: %s\nCompany Address: %s%s, %s, %s, %s\nCompany Phone Number: %s\n\n" \
      "${company_name}" "${address1}" "${address2}" "${city}" "${state}" "${zip}" "${phone}" | tee -a "${outputdir}/${state}_595.txt"
done < "${file_name}"

Когда вам не нужно видеть полный вывод в командной строке, вы можете заменить tee -a на >>.

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