Чтение нескольких строк с использованием строки чтения - PullRequest
1 голос
/ 13 марта 2020

ОК, я абсолютный новичок в этом (только начал пытаться кодировать несколько недель go для своей работы), поэтому, пожалуйста, go, не волнуйтесь, мне IM в системе AIX У меня есть file1, file2 и file3 и все они содержат 1 столбец данных (текстовых или числовых).

file1
VBDSBQ_KFGP_SAPECC_PRGX_ACCNT_WKLY
VBDSBQ_KFGP_SAPECC_PRGX_ADDRM_WKLY
VBDSBQ_KFGP_SAPECC_PRGX_COND_WKLY
VBDSBQ_KFGP_SAPECC_PRGX_CUSTM_WKLY
VBDSBQ_KFGP_SAPECC_PRGX_EPOS_DLY
VBDSBQ_KFGP_SAPECC_PRGX_INVV_WKLY

file2
MCMILS03
HGAHJK05
KARNEK93
MORROT32
LAWFOK12
LEMORK82


file3
8970597895
0923875
89760684
37960473
526238495
146407

В каждом из этих файлов будет одинаковое количество строк. У меня есть другой файл с именем "dummy_file", который я хочу вытащить, заменить детали и вставить в новый файл.

WORKSTATION#JOB_NAME
SCRIPTNAME "^TWSSCRIPTS^SCRIPT"
STREAMLOGON "^TWSUSER^"
-job JOB_NAME -user USER_ID -i JOB_ID
RECOVERY STOP

В этом файле меня интересуют только 3 строки, которые я хочу заменить, и они всегда будут одинаковыми для фиктивных файлов, которые я буду использовать в будущем

JOB_NAME
JOB_ID
USER_ID

Есть 2 записи для JOB_NAME и только 1 для остальных. Я хочу взять необработанный файл, заменить обе записи JOB_NAME на строку 1 из файла1, затем заменить USER_ID на строку 1 из файла 2, а затем заменить JOB_ID на строку 1 из файла3, а затем выбросить это в новый файл, для которого я хочу повторить процесс все строки в файлах 1, 2 и 3, поэтому для следующей записи будут заменены строки 2 из 3 файлов, затем для следующей записи будут заменены строки 3 из 3 файлов, а затем все строки 3 из файлов и и т. д. и т. д.

необработанный файл и ожидаемый результат ниже:

WORKSTATION#JOB_NAME
SCRIPTNAME "^TWSSCRIPTS^SCRIPT"
STREAMLOGON "^TWSUSER^"
-job JOB_NAME -user USER_ID -i JOB_ID
RECOVERY STOP



WORKSTATION#VBDSBQ_KFGP_SAPECC_PRGX_ACCNT_WKLY
SCRIPTNAME "^TWSSCRIPTS^SCRIPT"
STREAMLOGON "^TWSUSER^"
-job VBDSBQ_KFGP_SAPECC_PRGX_ACCNT_WKLY -user MCMILS03 -i 8970597895
RECOVERY STOP

это насколько я получил (опять же, я знаю его дерьмо)

file="/dir/dir/dir/file1"

while IFS= read -r line
do
cat dummy_file | sed "s/JOB_NAME/$file1/" | sed "s/JOB_ID/$file2/" | sed "s/USER_ID/$file3"  #####this is where i get stuck as i dont know how to reference file2 and file3##### >>new_file.txt
done

Ответы [ 4 ]

2 голосов
/ 13 марта 2020

Вы действительно не хотите делать / пока l oop в оболочке. Просто сделай:

awk '/^WORKSTATION/{
    getline jobname < "file1"; 
    getline user_id < "file2"; 
    getline job_id < "file3"
    }
    { 
    gsub("JOB_NAME", jobname); 
    gsub("USER_ID", user_id); 
    gsub("JOB_ID", job_id)
    }1'  dummy_file
0 голосов
/ 13 марта 2020

Bash вариант

#!/bin/bash

exec 5<file1 # create file descriptor for file with job names
exec 6<file2 # create file descriptor for file with job ids
exec 7<file3 # create file descriptor for file with user ids
dummy=$(cat dummy_txt) # load dummy text

output () { # create output by inserting new values in a copy of dummy var
    out=${dummy//JOB_NAME/$JOB_NAME}
    out=${out//USER_ID/$USER_ID}
    out=${out//JOB_ID/$JOB_ID}
    printf "\n$out\n"
}

while read -u5 JOB_NAME; do # this will read from all files and print output
      read -u6 JOB_id
      read -u7 USER_ID
      output
done

из read справка

$ read --help
      ...
      -u fd read from file descriptor FD instead of the standard input
      ...

и вариант с paste

#!/bin/bash
dummy=$(cat dummy)
while read JOB_NAME JOB_id USER_ID; do
    out=${dummy//JOB_NAME/$JOB_NAME}
    out=${out//USER_ID/$USER_ID}
    out=${out//JOB_ID/$JOB_ID}
    printf "\n$out\n"
done < <(paste file1 file2 file3)
0 голосов
/ 13 марта 2020

Использование GNU awk (ARGIND и 2d массивов):

$ gawk '
NR==FNR {                              # store the template file
    t=t (t==""?"":ORS) $0              # to t var
    next
}
{
    a[FNR][ARGIND]=$0                  # store filen records to 2d array
}
END {                                  # in the end
    for(i=1;i<=FNR;i++) {              # for each record stored from filen
        t_out=t                        # make a working copy of the template
        gsub(/JOB_NAME/,a[i][2],t_out) # replace with data
        gsub(/USER_ID/,a[i][3],t_out)
        gsub(/JOB_ID/,a[i][4],t_out)
        print t_out                    # output
    }
}' template file1 file2 file3

Вывод:

WORKSTATION#VBDSBQ_KFGP_SAPECC_PRGX_ACCNT_WKLY
SCRIPTNAME "^TWSSCRIPTS^SCRIPT"
STREAMLOGON "^TWSUSER^"
-job VBDSBQ_KFGP_SAPECC_PRGX_ACCNT_WKLY -user MCMILS03 -i 8970597895
RECOVERY STOP
...
0 голосов
/ 13 марта 2020

Это может работать для вас (GNU Parallels и Sed):

parallel -q sed 's/JOB_NAME/{1}/;s/USER_ID/{2}/;s/JOB_ID/{3}/' templateFile >newFile :::: file1 ::::+ file2 ::::+ file3

Это создает новый файл путем добавления шаблона файла для каждого экземпляра строки совместно в file1, file2 и file3.

Примечание: операция ::::+ обеспечивает объединение строк в файлах file1, file2 и file3, а не в продукте по умолчанию.

...