如何在 Bash 脚本中的不同文件之间复制和粘贴文本行?

如何在 Bash 脚本中的不同文件之间复制和粘贴文本行?

我需要从一定数量的文件中创建一个新文件,其中每行文本都是原始文件中相应行的序列。因此,假设我有两个文件,其结构如下:

文件1:

AAAA
BBBB
CCCC

文件2:

XXXX
YYYY
ZZZZ

我需要将它们结合起来才能得到如下结果:

AAAAXXXX
BBBBYYYY
CCCCZZZZ

我如何通过 Bash 脚本做到这一点?

答案1

使用paste命令:

paste -d '' File1 File2

默认情况下,paste使用制表符连接行,所以我们需要使用选项-d来告诉它使用空字符串进行连接。

答案2

通过方式:

awk '{getline x<"file2"; print $0x}' file1
  • getline x<"file2"读取整行文件2并保持X多变的。
  • print $0x打印整行文件1通过使用$0then ,x这是保存的行文件2

答案3

paste是可行的方法,但为了完整起见,这里有一个bash有针对性的解决方案(几乎没有得到seq、 和 的帮助wc):

for _ in $(seq 1 $(wc -l <f1.txt)); do \
            read -u 3 one; read -u 4 two; echo "${one}${two}"; done 3<f1.txt 4<f2.txt

这里我们通过文件描述符 3 和 4发送文件f1.txt、 和的内容。从相应的 FD 读取,并以所需的格式打印输出。f2.txtreadecho

迭代f1.txt结束后就会停止,这里_是一个一次性变量。


更好的是,只需bash根据read达到 EOF 时的退出状态,使用while构造(感谢钢铁司机):

while IFS= read -ru3 one && IFS= read -ru4 two; do echo "${one}${two}"; done 3<f1.txt 4<f2.txt

例子:

$ cat f1.txt
AAAA
BBBB
CCCC

$ cat f2.txt
XXXX
YYYY
ZZZZ

$ for _ in $(seq 1 $(wc -l <f1.txt)); do read -u 3 one; read -u 4 two; echo "${one}${two}"; done 3<f1.txt 4<f2.txt
AAAAXXXX
BBBBYYYY
CCCCZZZZ

$ while IFS= read -ru3 one && IFS= read -ru4 two; do echo "${one}${two}"; done 3<f1.txt 4<f2.txt
AAAAXXXX
BBBBYYYY
CCCCZZZZ

相关内容