У меня есть текст в единственном файле
Тест
Worker(Thomas) works in ..........
Worker(Alfred) works in ..........
Worker(Albert) works in ..........
Ответ
Worker(Thomas) works for company(google)
Worker(Alfred) works for company(apple)
Worker(Albert) works for company(Microsoft)
Я хочу заменить пустые пунктирные линии в "Тесте" от информации, данной в "Ответе" при помощи базирующегося текстового поиска sed, соответствия и замены.
Я предлагаю использовать awk
для этой задачи. Принятие Вас имеет два отдельных файла Quiz
и Answer
в том же каталоге, cd
в тот каталог и выполненный следующая команда в терминале:
awk 'NR==FNR{a[$1]=$4; next}{$4=a[$1]; print}' > Answered_Quiz Answer Quiz
Называют новый файл Answered_Quiz
будет создан в том же каталоге, и он будет содержать желаемый результат.
Если все строки находятся в одном файле, можно разделить его сначала:
выполните следующую замену команды FileName
с Вашим именем текстового файла:
awk '$4 ~ /(^[\.]+$)/' > Quiz FileName
сделать файл Теста.
затем выполните следующую замену команды FileName
с Вашим именем текстового файла:
awk '$4 !~ /(^[\.]+$)/' > Answer FileName
получить файл Ответа. Ваш исходный файл не будет затронут
Или если все строки находятся в одном файле, и Вы предпочитаете не разделять файл, использовать следующий код в файле сценария (или можно просто скопировать и вставить его в терминале и нажать Enter) из того же каталога:
#!/bin/bash
pat1="(^[\.]+$)"
while read f1 f2 f3 f4 f5
do
if [[ "$f4" =~ $pat1 ]]
then
# change Quiz in the following line with your source file name
a4=$(awk -v ff1="$f1" '$4 !~ /(^[\.]+$)/ && $1 == ff1 {print $4}' "Quiz")
echo "$f1 $f2 $f3 $a4" >> "Answered_Quiz"
fi
# change Quiz in the following line with your source file name
done < "Quiz"
Новый файл по имени Answered_Quiz будет создан в том же каталоге, и он будет содержать желаемый результат.
Всего наилучшего