我需要从一定数量的文件中创建一个新文件,其中每行文本都是原始文件中相应行的序列。因此,假设我有两个文件,其结构如下:
文件1:
AAAA
BBBB
CCCC
文件2:
XXXX
YYYY
ZZZZ
我需要将它们结合起来才能得到如下结果:
AAAAXXXX
BBBBYYYY
CCCCZZZZ
我如何通过 Bash 脚本做到这一点?
答案1
答案2
通过awk方式:
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
读取整行文件2并保持X多变的。print $0x
打印整行文件1通过使用$0
then ,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.txt
read
echo
迭代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