假设我有 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()