Прочитать два файла и записать данные последовательно в третий файл с помощью сценария оболочки

#bash #shell #awk

#bash #оболочка #awk

Вопрос:

У меня есть два файла. Первый файл содержит постоянные данные (например, файл ссылки). В другом файле содержатся динамические данные. Он имеет значения, связанные с ключами первого файла с помощью сценария оболочки.

File1.txt

 CIN|Template|Date
  

File2.txt

 1234|QWERTY|2019-03-18
5678|ASDF|2019-03-18
9012|ZXCVB|
  

Я хочу, чтобы выходной файл Output.txt выглядел:

 {CIN: 1234
Template: QWERTY
Date:  2019-03-18}
{CIN: 5678
Template: ASDF
Date: 2019-03-18}
{CIN: 9012
Template: ZXCV
Date: }
  

Комментарии:

1. Вы пробовали что-нибудь (кстати, не мой downvote)?

2. …иными словами, хороший вопрос — это не просто спецификация кода, который вы хотите, чтобы написал кто-то другой, на самом деле это вопрос об изолированной проблеме, с которой вы столкнулись при самостоятельном написании кода , показывающий ваши существующие усилия и где / как вы застряли.

Ответ №1:

Используя awk:

 $ awk -F| '             # set field separator
NR==FNR {                # process first file
    split($0,a)          # split on field separator and hash to a
    next
}
{                        # second file
    for(i=1;i<=NF;i  )   # iterate all fields and output refering titles from a
        printf "%s%s: %s%sn",(i==1?"{":""),a[i],$i,(i==NF?"}":"")
}' file2 file2
  

Вывод:

 {CIN: 1234
Template: QWERTY
Date: 2019-03-18}
{CIN: 5678
Template: ASDF
Date: 2019-03-18}
{CIN: 9012
Template: ZXCVB
Date: }
  

Ответ №2:

попробуйте это:

 #!/bin/bash
FILE1=File1.txt
FILE2=File2.txt

IFS="|"
read -a Header < $FILE1
ColumnsCount=${#Header[@]}

while read line; do
    read -a Values <<< $line
    echo -n "{"
    for ((i=0; i < $ColumnsCount; i  )); do
        echo -n "${Header[$i]}: ${Values[$i]}"
        if [[ $i -lt $((ColumnsCount - 1)) ]]; then
            echo
        fi
    done
    echo "}"
done < $FILE2
  

Ответ №3:

Вот мое решение

 awk -F "|" 'NR==FNR {first= $1; second=$2; third=$3;} NR > 1{print "{" first ":" $1 "n" second ":" $2 "n" third ": "$3  "}" }' File1.txt File2.txt


{CIN:1234
Template:QWERTY
Date: 2019-03-18}
{CIN:5678
Template:ASDF
Date: 2019-03-18}
{CIN:9012
Template:ZXCVB
Date: }