Заменить определенный текст в файле с каждой строкой списка в другом файле - PullRequest
0 голосов
/ 27 октября 2019

У меня есть текстовый файл, который представляет собой огромный список. Каждая строка представляет значение.

Я бы хотел заменить каждое конкретное значение в основном файле каждой строкой txt-файла.

Поиск выполнен, но не удалось найти что-то похожее в bash. или python.

Пример (каждую «1» в главном файле следует заменить каждой строкой txt-файла):

Txt file
A
B
C
D
E

Main file
httpDownload("1", localPath .."1")
httpDownload("1", localPath .."1")
httpDownload("1", localPath .."1")
httpDownload("1", localPath .."1")
httpDownload("1", localPath .."1")

Result
httpDownload("A", localPath .."A")
httpDownload("B", localPath .."B")
httpDownload("C", localPath .."C")
httpDownload("D", localPath .."D")
httpDownload("E", localPath .."E")

Ответы [ 3 ]

4 голосов
/ 27 октября 2019

Просто используйте gawk getline, чтобы использовать строку из указанного файла:

$ awk '{ getline c < "f1.txt"; gsub("1", c, $0) }1' main.txt
httpDownload("A", localPath .."A")
httpDownload("B", localPath .."B")
httpDownload("C", localPath .."C")
httpDownload("D", localPath .."D")
httpDownload("E", localPath .."E")
2 голосов
/ 27 октября 2019

Не могли бы вы попробовать следующее.

awk 'FNR==NR{a[FNR]=$0;next} {gsub(/1/,a[++count])} 1' text_file main_file

ИЛИ Чтобы сохранить вывод в самом main_file, используйте следующее.

awk 'FNR==NR{a[FNR]=$0;next} {gsub(/1/,a[++count])} 1' text_file main_file > temp && mv temp main_file

Выходбудет выглядеть следующим образом.

httpDownload("A", localPath .."A")
httpDownload("B", localPath .."B")
httpDownload("C", localPath .."C")
httpDownload("D", localPath .."D")
httpDownload("E", localPath .."E")


2-е решение: В случае, если ваш текстовый файл имеет меньшие строковые значения, чем ваш основной_файл, вы можетенужно начать с 1-го (снова из символа A, чтобы поместить его в main_file), затем использовать следующее.

awk '
FNR==NR{
  a[FNR]=$0
  next
}
FNR==1{
  val=length(a)
}
{ 
  gsub(/1/,a[++count])
  count=val==count?0:count
}
1
' text_file main_file
0 голосов
/ 27 октября 2019

Надежно:

$ cat tst.awk
BEGIN {
    tgt  = 1
}
NR==FNR {
    if ( /"/ ) {
        printf "WARNING: %s line %d contains \": %s\n", FILENAME, NR, $0 | "cat>&2"
    }
    if ( /\\$/ ) {
        printf "WARNING: %s line %d ends in \\: %s\n", FILENAME, NR, $0 | "cat>&2"
    }
    vals[NR] = $0
    next
}
{
    old = $0
    new = ""
    while ( pos = index(old,tgt) ) {
        new = new substr(old,1,pos-1) vals[FNR]
        old = substr(old,pos+length(tgt))
    }
    $0 = new old
    print
}

.

$ cat file
"
&
\
\1
E

$ awk -f tst.awk file main
httpDownload(""", localPath ..""")
httpDownload("&", localPath .."&")
httpDownload("\", localPath .."\")
httpDownload("\1", localPath .."\1")
httpDownload("E", localPath .."E")
WARNING: file line 1 contains ": "
WARNING: file line 3 ends in \: \
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...