#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: }