Использование bash для копирования содержимого строки в одном файле в определенную позицию символа в другом файле - PullRequest
0 голосов
/ 26 октября 2018

Я новичок в bash и мне нужна помощь для копирования строки 2 и более из одного файла в определенную позицию (150 символов в) в другом файле.Просматривая форум, я нашел способ включить определенный текст, указанный в этой позиции:

sed -i 's / ^ (. {150}) / \ 1specifictextlisted /' destinationfile.txt

Однако я не могу найти способ скопировать содержимое из одного файла в этот.

По сути, я работаю с этими двумя исходными файлами и мне нужен следующий вывод:

Файл 1 содержание:

Последовательность
AAAAAAAAAGGGGGGGGGGGCCCCCCCCCTTTTTTTTT

Файл 2 содержание:

ChR2
tccccagcccagccccggccccatccccagcccagcctatccccagcccagcctatccccagcccagccccggccccagccccagccccggccccagccccagccccggccccagccccggccccatccccggccccggccccatccccggccccggccccggccccggccccggccccatccccagcccagccccagccccatccccagcccagccccggcccagccccagcccagccccagccacagcccagccccggccccagccccggcccaggcccagcccca

Желаемое содержимое вывода:

chr2 tccccagcccagccccggccccatccccagcccagcctatccccagcccagcctatccccagcccagccccggccccagccccccagccccggccccccagccccccccggccccagccccggccccatccccggccccggccccatccccgAAAAAAAAAGGGGGGGGGGGCCCCCCCCCTTTTTTTTTgccccggccccggccccggccccggccccatccccagcccagccccagccccatccccagcccagccccggcccagccccagcccagccccagccacagcccagccccggccccagccccggcccaggcccagcccca

Кто-нибудь может поставить меня на верном пути к достижению этого?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Вы можете использовать bash и читать по одному символу за раз из файла:

i=1
while read -n 1 -r; do
    echo -n "$REPLY"
    let i++
    if [ $i -eq 150 ]; then
        echo -n "AAAAAAAAAGGGGGGGGGGGCCCCCCCCCTTTTTTTTT"
    fi
done < chr2 > destinationfile.txt

Это просто читает символ, выводит его на экран и увеличивает счетчик.Если счетчик 150, это повторяет вашу последовательность.Вы можете заменить эхо на cat file | tr -d '\n'.Просто убедитесь, что удалили все новые строки, как здесь с tr.Именно поэтому я использую echo -n, поэтому он не добавляет ничего.

0 голосов
/ 26 октября 2018

Если файл очень большой, вместо 327 символов, вы можете использовать dd:

dd if=chr2 bs=1 count=150 status=none of=destinationfile.txt
tr -d '\n' < Sequence >> destinationfile.txt
dd if=chr2 bs=1 skip=150 seek=189 status=none of=destinationfile.txt

189 - это 150 + длина Sequence.

0 голосов
/ 26 октября 2018

Вы можете использовать awk для этого:

awk 'NR==FNR{a=$2;next}{print $1, substr($2, 0, 149) "" a "" substr($2, 150)}' file1 file2

Объяснение:

# Total row number == row number in file
# This is only true when processing file1
NR==FNR {
    a=$2 # store column 2 in a variable 'a'
    next # do not process the block below
}
# Because of the 'next' statement above, this
# block gets only executed for file2
{
    # put 'a' in the middle of the second column and print it
    print $1, substr($2, 0, 149) "" a "" substr($2, 150)
}

Я предполагаю, что оба файла содержат только одну строку, как в вашем примере.


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

# usage: awk -f this_file.awk file1 file2

# True for the second line in each file
FNR==2 {
    # Total line number equals line number in file
    # This is only true while we are processing file1
    if(NR==FNR) {
        insert=$0 # Store the string to be inserted in a variable
    } else {
        # Insert the string in file1
        # Assigning to $0 will modify the current line
        $0 = substr($0, 0, 149) "" insert "" substr($0, 150)
    }
}

# Print lines of file2 (line 2 has been modified above)
NR!=FNR
...