我该如何同时每次从两个文件中读取一行?假设我有以下内容的file1和file2:
file1:
line1.a
line2.a
line3.a
文件2:
line1.b
line2.b
line3.b
我该如何获得这样的输出 -
line1.a
line1.b
line2.a
line2.b
line3.a
line3.b
...
...
[jaypal:~/Temp] cat file1
line1.a
line2.a
line3.a
line4.a
[jaypal:~/Temp] cat file2
line1.b
line2.b
line3.b
line4.b
<&3让Bash读取描述符3处的文件。您应该知道,0、1和2描述符分别用于标准输入、标准输出和标准错误输出。因此,我们应避免使用这些描述符。另外,9之后的描述符由bash内部使用,因此您可以使用从3到9中的任一个描述符。
[jaypal:~/Temp] while read -r a && read -r b <&3; do
> echo -e "$a\n$b";
> done < file1 3<file2
line1.a
line1.b
line2.a
line2.b
line3.a
line3.b
line4.a
line4.b
[jaypal:~/Temp] paste -d"\n" file1 file2
line1.a
line1.b
line2.a
line2.b
line3.a
line3.b
line4.a
line4.b
sed 'R file2' file1
以防对某人有所帮助。有不同的方法可以实现这一点,以下是两个简单的示例。
Head -n<N> | tail -n1
代替sed
。
Sleep
用于更方便的阅读。i=0; k="$(wc -l file1 | awk '{print $1}')"; while [ $i -lt $k ]; do ((i++)); sed -n "$i"p file1; sed -n "$i"p file2; echo "---------------"; sleep 1; done
结果:
1619523081232 -- sent msg # 1
1619523085287 -- no msgs received
---------------
1619523082233 -- sent msg # 2
1619523085296 -- 1 msgs received
tail -F -n1 file1 file2
结果:
==> file1 <==
1619523081232 -- sent msg # 1
==> file2 <==
1619523085287 -- no msgs received
C#:
string[] lines1 = File.ReadAllLines("file1.txt");
string[] lines2 = File.ReadAllLines("file2.txt");
int i1 = 0;
int i2 = 0;
bool flag = true;
while (i1+i2 < lines1.Length + lines2.Length)
{
string line = null;
if (flag && i1 < lines1.Length)
line = lines1[i1++];
else if (i2 < lines2.Length)
line = lines2[i2++];
else
line = lines1[i1++];
flag = !flag;
Console.WriteLine(line);
}