当前位置: 首页>>技术教程>>正文


bash – 如何逐行合并文件?

, , , ,

问题描述

cat 文件1

foo
ice
two

cat 文件2

bar
cream
hundred

期望的输出:

foobar
icecream
twohundred

在我的场景中,file1 和 file2 将始终具有相同数量的行,以防万一让事情变得更容易。

最佳思路

这项工作的正确工具可能是 paste

paste -d '' file1 file2

有关详细信息,请参阅 man paste


您还可以使用 pr 命令:

pr -TmJS"" file1 file2

在哪里

  • -T 关闭分页

  • -mJ 合并文件,加入整行

  • -S"" 用空字符串分隔列


如果您真的想使用纯 bash shell(不推荐)来做到这一点,那么这就是我的建议:

while IFS= read -u3 -r a && IFS= read -u4 -r b; do 
  printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2

(仅包含此内容是因为该主题出现在对另一个提议的 pure-bash 解决方案的评论中。)

次佳思路

通过awk方式:

awk '{getline x<"file2"; print $0x}' file1
  • getline x<"file2" 从 file2 读取整行并保存到 x 变量中。

  • print $0x 通过使用 $0x 打印 file1 中的整行,x 是 file2 的保存行。

第三种思路

paste 是要走的路。如果你想检查一些其他的方法,这里是一个 python 解决方案:

#!/usr/bin/env python2
import itertools
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
    lines = itertools.izip_longest(f1, f2)
    for a, b in lines:
        if a and b:
            print a.rstrip() + b.rstrip()
        else:
            if a:
                print a.rstrip()
            else:
                print b.rstrip()

如果您的行数很少:

#!/usr/bin/env python2
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
    print '\n'.join((a.rstrip() + b.rstrip() for a, b in zip(f1, f2)))

请注意,对于不相等的行数,此行将在最先结束的文件的最后一行结束。

第四种思路

此外,使用纯 bash(请注意,这将完全忽略空行):

#!/bin/bash

IFS=$'\n' GLOBIGNORE='*'
f1=($(< file1))
f2=($(< file2))
i=0
while [ "${f1[${i}]}" ] && [ "${f2[${i}]}" ]
do
    echo "${f1[${i}]}${f2[${i}]}" >> out
    ((i++))
done
while [ "${f1[${i}]}" ]
do
    echo "${f1[${i}]}" >> out
    ((i++))
done
while [ "${f2[${i}]}" ]
do
    echo "${f2[${i}]}" >> out
    ((i++))
done

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12379.html,未经允许,请勿转载。