我将file1.txt作为
data 1
data 2
data 3
data 4
同样我还有另一个file2.txt
record 1
record 2
record 3
record 4
在这两种情况下,我都有相同数量的记录。
我可以通过
访问file1.txt中的每一行for line in file1.txt
echo $line
我想从单循环中的两个文件中访问第一条记录,依此类推。之所以我希望从单个循环中的两个文件中首先记录,因为我将基于这两个数据生成html代码。如果不是这样,任何人都可以帮助其他方式。
请帮助。
答案 0 :(得分:2)
% cat data
data 1
data 2
data 3
% cat record
record 1
record 2
record 3
% paste data record
data 1 record 1
data 2 record 2
data 3 record 3
%
答案 1 :(得分:1)
exec 3< file2
while read -r line1; do read -r line2 <&3; echo "$line1 $line2"; done < file1
输出:
data 1 record 1 data 2 record 2 data 3 record 3 data 4 record 4
答案 2 :(得分:1)
paste
命令可能会对您有所帮助,如果您要执行的操作是逐行加入文件。它不是bash的一部分,它是自1979年以来几乎在每个unix系统上安装的工具。: - )
$ cat record
ONE
TWO
THREE
$ cat data
one
two
three
$ paste record data
ONE one
TWO two
THREE three
在bash中同时从多个文件中读取是很棘手的。一些人认为使用多个文件句柄是&#34;高级&#34;。
这样的bash脚本可能就是这样。
#!/usr/bin/env bash
exec 3< data
while read left; do
read right <&3
echo "$left /// $right" # or whatever you need to do
done < record
这将打开文件句柄3上的文件data
(保留文件句柄0,文件句柄0,文件record
),并逐步读取每个文件,从两者中读取。
或者,如果您希望以不同的方式处理文本,可以使用awk
(不 bash,但通常安装在安装了bash的任何位置):
awk '{getline B < "data"; print $0 "\t" B;}' record > combined.txt
这将逐行浏览每个文件,打开两个文件并从每个文件中读取一行。它的优点是不需要大量内存来存储文件。
或者,更高性能的解决方案是将一个文件存储在一个数组的内存中,然后逐行处理另一个文件:
awk 'NR==FNR{a[NR]=$0;next;} {print $0 "\t" a[FNR];}' record data
在任何一种情况下,用您需要的任何处理替换print
函数。
答案 3 :(得分:1)
其他人给你的类似建议,但我会在一个while循环的条件下从每个文件中读取:
while IFS= read -r -u3 data && IFS= read -r -u4 record; do
echo "$data => $record"
done 3< file1.txt 4< file2.txt
输出
data 1 => record 1
data 2 => record 2
data 3 => record 3
data 4 => record 4