我想同时对两个文件中的文本做一些事情。
fname3=XX1.txt fname2=XX2.txt
while read -r -u3 line1; read -r -u4 line2; do
echo "$line1:$line2";
done 3< "$fname3" 4< "$fname2"
输出总是显示“:(文本)”,我希望它输出“(文本):(文本)”。文件很大,有关系吗?
这适用于任何大小的文件。这是一个完整的、独立的脚本,用于演示百万行文件:
#!/bin/bash
printf "foo%s\n" {1..1000000} > XX1.txt
printf "bar%s\n" {1..1000000} > XX2.txt
fname3=XX1.txt fname2=XX2.txt
while read -r -u3 line1; read -r -u4 line2; do
echo "$line1:$line2";
done 3< "$fname3" 4< "$fname2"
输出是:
foo1:bar1
foo2:bar2
...
foo999999:bar999999
foo1000000:bar1000000
如果第一个文件比第二个文件短,最后剩余的行将:line
一直持续到第二个文件被完全读取。如果第二个文件较短,脚本将在完成后停止并忽略第一个文件的其余部分。
要在任何文件用完行时停止,请使用&&
而不是;
分隔读取语句。要读取直到两个文件都超出行数,请使用||
.
如果您只想连接相应的行,请使用paste
:
paste -d : $fname3" "$fname2"