如何从文件中逐个复制行,然后使用shell脚本在每n行后粘贴到另一个文件中

时间:2017-12-14 20:12:27

标签: bash csh

说我有内容

的file1
line1
line2
line3

和另一个内容为

的文件2
lineA
lineB
lineC
lineD
lineE
lineF
lineG
lineH
lineI

我想将file2设为

lineA
lineB
lineC
line1
lineD
lineE
lineF
line2
lineG
lineH
lineI
line3

4 个答案:

答案 0 :(得分:1)

以下是使用paste

执行此操作的方法
cat file2 | paste -d'\n' - - - file1

paste的短划线参数意味着从标准输入读取,即cat file2输出,而第四个参数是file1。因此,使用三个破折号,我们将粘贴一个文件的每3行与另一个文件中的1,并且分隔符是换行符(-d'\n')。

这将适用于任何这些文件中的剩余行,因为当其中一个输入找到EOF时,粘贴将继续。但是在这种情况下它可能会打印几个空行,所以你可以通过管道去任何命令来删除它们(假设你的文件中没有实际的空行),例如

cat file2 | paste -d'\n' - - - file1 | sed '/^$/d'

答案 1 :(得分:0)

这个python代码会这样做,你的案例中的参数将是

python interlace.py file1 file2 file3 3

如果您希望它就位,我建议您稍后使用mv file3 file2。这是因为如果你在读取所有内容之前就开始写入文件2,那么可以覆盖它

import sys

if len(sys.argv[1:]) == 4:
    file1 = open(sys.argv[1], 'r')
    file2 = open(sys.argv[2], 'r')
    file3 = open(sys.argv[3], 'w')
    line_count = int(sys.argv[4])

    current_counter = 0
    for file2_line in file2.readlines():
        current_counter += 1
        file3.write(file2_line)
        if current_counter == line_count:
            file3.write(file1.readline())
            current_counter = 0

    for file1_line in file1.readlines():
        file3.write(file1_line)

    file3.close()

这也适用于file1提前用完行的情况,在这种情况下file2的行继续正常运行,而当file1有额外的行时,它们只会被添加到结尾。

答案 2 :(得分:0)

这可能适合你(GNU sed):

@Mock
ClientFactory clientFactoryMock;
@Mock
SoapServiceClient soapServiceClientMock; 

@Test
public void myTest(){
    ...
   //add record for soapServiceClientMock
   Mockito.when(soapServiceClientMock.xxx()).return(...);
   // and return soapServiceClientMock as getInstance() is invoked        
   Mockito.when(clientFactoryMock.getInstance()).return(soapServiceClientMock);
}

在第三行之后,随后是file2的每三行,从file1附加一行。

答案 3 :(得分:0)

使用awk和getline

awk '1;NR%3==0{if((getline < "file1")>0)print}' file2
lineA
lineB
lineC
line1
lineD
...

您可能会将其混淆为awk '1;NR%3==0&&(getline < "file1")' file2(未经测试)。