使用bash将一个文件中的行内容复制到另一文件中的特定字符位置

时间:2018-10-25 21:57:46

标签: linux bash sed pipe

我是bash的新手,需要帮助将第2行向前从一个文件复制到另一个文件中的特定位置(150个字符)。通过浏览论坛,我找到了一种方法来包含此位置列出的特定文本:

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

但是,我似乎找不到一种将内容从一个文件复制到其中的方法。

基本上,我正在使用这两个起始文件,并且需要以下输出:

文件1的内容:

  

序列
  AAAAAAAAAGGGGGGGGGGGCCCCCCCCTTTTTTTTTT

文件2的内容:

  

chr2
  tccccagcccagccccggccccatccccagcccagcctatccccagcccagcctatccccagcccagccccggccccagccccagccccggccccagccccagccccggccccagccccggccccatccccggccccggccccatccccggccccggccccggccccggccccggccccatccccagcccagccccagccccatccccagcccagccccggcccagccccagcccagccccagccacagcccagccccggccccagccccggcccaggcccagcccca

所需的输出内容:

  

chr2   tccccagcccagccccggccccatccccagcccagcctatccccagcccagcctatccccagcccagccccggccccagccccagccccggccccagccccagccccggccccagccccggccccatccccggccccggccccatccccgAAAAAAAAAGGGGGGGGGGGCCCCCCCCCTTTTTTTTTgccccggccccggccccggccccggccccatccccagcccagccccagccccatccccagcccagccccggcccagccccagcccagccccagccacagcccagccccggccccagccccggcccaggcccagcccca

有人可以让我走上正确的道路吗?

3 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

如果文件确实很大,而不是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的长度。

答案 2 :(得分:0)

您可以使用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而不添加任何内容的原因。