获取与一个文件中的模式匹配的行并将其放入与相同模式匹配的第二个文件中

获取与一个文件中的模式匹配的行并将其放入与相同模式匹配的第二个文件中

假设我有 2 个文件,每个文件都包含以“b”字符开头的行,我只想按照它们在第一个文件中出现的顺序合并这些行。

第一个文件 (1.txt)

b 12 32
b 23 43
b 23 63

第二个文件 (2.txt)

a 1322
c 233
g 23324
s 24352

b
h vd2 3f4g

a 2t42
c 34536
g h3443e
s 24h455

b
h 3434gggdfbv4

a 423gwg
c f24bv
g 34g 45h
s 4zth5

b
h 3456zh543

您可以看到,在第二个文件中,以“b”字符开头的行不包含任何更多信息,而在第一个文件中,我的行仅以“b”开头,后跟一些整数值。

我现在需要的是获取第一个文件中的整数,并将它们放入第二个文件“b”行中,就像在第一个文件中显示的那样。因此,第二个文件最终应如下所示:

合并文件(3.txt)

a 1322  
c 233  
g 23324  
s 24352  

b 12 32  
h vd2 3f4g  

a 2t42  
c 34536  
g h3443e  
s 24h455  

b 23 43  
h 3434gggdfbv4  

a 423gwg  
c f24bv  
g 34g 45h  
s 4zth5  

b 23 63  
h 3456zh543  

加入命令似乎能够执行我想要的操作,但我找不到一种方法来告诉它仅在与前导“b”字符匹配的行上工作。我还考虑过循环遍历文件 1 以获取与模式“^b”匹配的行号,然后使用它们替换文件 2 中与模式“^b”匹配的行,但我再次找不到有效的解决方案。有谁知道用一句简短的 bash 脚本来完成我的任务吗?

答案1

使用 GNU sed:

sed -e '/^b/{R 1.txt' -e 'd}' 2.txt

如果您想2.txt“就地”编辑文件,请添加sed的选项-i

答案2

awk

awk 'NR==FNR{a[++i]=$0;next}$0=="b"{$0=a[++j]}1' file1 file2

首先,我们用 file1 的内容填充数组a,当处理 file2 时,将打印数组来代替仅包含字母“b”的行。

答案3

也许用 Perl 会更容易,但我还没有学过 Perl。

awk你可以用一些技巧来做到这一点:

awk 'NR == FNR { line[NR] = $0; next } /^b/ { $0 = line[++whichline] } 1' 1.txt 2.txt > 3.txt

这会将第一个文件中的所有行存储到名为 的数组中line,然后将这些行放入第二个文件中匹配的行中/^b/

答案4

Python 可以在这里提供帮助:

    #!/bin/env python
    fileA=open('filea','r')
    fileB=open('fileb','r')
    resultFile = open('resultfile','w')
    linesA=fileA.readlines()
    i=0
    for line in fileB:
      if line.lstrip().startswith('b'):
        resultFile.write(linesA[i].rstrip())
        i=i+1
      else:
        resultFile.write(line)
   fileA.close()
   fileB.close()
   resultFile.close()

相关内容